使用SingleConnection = true

时间:2016-05-01 08:46:15

标签: jpa eclipselink ucanaccess

我有一个项目使用EclipseLink-2.6.0和UCanAccess-3.0.4(作为DB驱动程序)来修改MS Access数据库。 (NB遗留要求 - 不是我的选择)。

有一个包含单精度列的表(同样,遗留要求 - 不是我的选择)。

如果该字段已更新,那么该“点”之后的任何更新都“提交”,但在关闭并重新打开数据库之后,该字段的上次更新始终是初始更新,并且所有其他更新都已丢失。

我已经整合了一个项目,该项目使用JPA和直接使用JDBC来测试此场景。 JDBC连接正确刷新了对数据库的更改,而JPA测试没有。

测试项目的网址为:https://github.com/william-ferguson-au/eclipselink-flush-test

注意UCanAccess连接配置为 SingleConnection = true ,因为我需要确保一旦关闭EntityManagerFactory,就会释放MS Access DB上的锁定。我认为这是问题的症结所在。

失败的测试输出类似于:

[EL Info]: server: 2016-05-01 17:59:35.858--ServerSession(1690826692)--Detected server platform: org.eclipse.persistence.platform.server.NoServerPlatform.
lastValue=0.0 entry#value=0.0 newValue=1.4
lastValue=1.4 entry#value=1.4 newValue=2.8
lastValue=2.8 entry#value=2.8 newValue=4.2
lastValue=4.2 entry#value=4.2 newValue=5.6
lastValue=5.6 entry#value=5.6 newValue=7.0
lastValue=7.0 entry#value=7.0 newValue=8.4
lastValue=8.4 entry#value=8.4 newValue=9.8
lastValue=9.8 entry#value=9.8 newValue=11.2
lastValue=11.2 entry#value=11.2 newValue=12.6
lastValue=12.6 entry#value=12.6 newValue=14.0
lastValue=14.0 entry#value=14.0 newValue=15.4
lastValue=15.4 entry#value=15.4 newValue=16.8
lastValue=16.8 entry#value=16.8 newValue=18.2

Database - closed
Database - reopened

[EL Warning]: 2016-05-01 17:59:39.906--session_manager_no_partition
 lastValue=18.2
[EL Info]: server: 2016-05-01 17:59:39.922--ServerSession(1276502808)--Detected server platform: org.eclipse.persistence.platform.server.NoServerPlatform.
lastValue=18.2 entry#value=1.4 newValue=28.2
[EL Warning]: 2016-05-01 17:59:40.568--session_manager_no_partition

java.lang.AssertionError: Expected=18.2 found=1.4

    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at au.com.xandar.eclipselink.flush.DoubleFlushTest.verifyEntityValue(DoubleFlushTest.java:133)
    at au.com.xandar.eclipselink.flush.DoubleFlushTest.testExplicitUpdatesJPA(DoubleFlushTest.java:120)

如果在配置EntityManagerFactory时设置 SingleConnection = false ,则更新将刷新到数据库,并在重新打开数据库时可见。但是,我无法释放MS Access DB上的文件锁,直到VM被破坏。

所以我认为这是EclipseLink(https://bugs.eclipse.org/bugs/show_bug.cgi?id=492773)中的一个错误。但现在我认为它更可能是UCanAccess在JPA环境中处理 SingleConnection = true 的方式中的错误。或者我可能缺少一些配置,以便以与JDBC相同的方式使EclipseLink JPA刷新。

这应该像使用UCanAccess和SingleConnection = true的预期行为一样?

关注#1

@GordThompson指出原始数据库字段是单个字段而不是双字段。并且将DB字段更改为double(以匹配原始Entity字段)使一切正常。但我无法改变数据库。所以我将Entity字段更改为Float(即单个)以匹配DB字段,问题仍然存在,甚至更为普遍。

然后我意识到行为会根据JPA环境中UCanAccess SingleConnection 属性的值而改变。

关注#2

仅在使用PreparedStatement和SingleConnection = true时才可以使用UCanAccess进行复制。查看更新的测试用例。

关注#3 似乎只有在更新浮点/双字段,关闭数据库,打开数据库,检查字段,关闭数据库,为不同的数据库重复相同时才会出现问题,此时第2个数据库都没有值数据库得到持久化。仍然出现在 UCanAccess-3.0.5

Discusion已移至https://sourceforge.net/p/ucanaccess/discussion/general/thread/a6a192d0

2 个答案:

答案 0 :(得分:2)

由于镜像hsqldb数据库与mdb中持久保存的数据之间在特定条件下未对齐,这是一个严重错误。 它间接取决于hsqldb中管理FLOAT数据的方式。 我已经找到了解决方案,因此修复程序将在3.0.5中。我将尽快释放它,希望本周结束,下周晚些时候。谢谢你们!

答案 1 :(得分:0)

如果您在Access

中打开测试数据库
eclipselink-flush-test-master\src\test\db\PairedDown-2000.mdb

然后在设计视图中打开TABLE1,您将看到DOUBLE_RESULT字段实际定义为Single

TABLE1.png

当我将该字段更改为Double并重新运行您的测试项目时,问题就消失了。