如果发生警告,Eclipselink不会释放连接

时间:2016-04-12 07:29:44

标签: java mysql jpa eclipselink connection-pooling

我有一个奇怪的情况,不确定这是我的错误,还是eclipselink的标准行为。请帮助理解:

  1. 我插入的mysql值超过最大列长度(1000个符号vs varchar(512))。
  2. MySQL会插入,但会截断值。
  3. Eclipselink在这种情况下抛出异常(mysql完整性异常)
  4. Eclipselink不会释放连接。
  5. 在几次这样的错误请求之后,我的连接池是空的。
  6. 所有下一次尝试都失败并出现InterruptedException(ClientSession上的等待失败)。
  7. 更新(可能的解决方案)

    1. 我使用sql_mode ='STRICT_TRANS_TABLES',因此大多数警告变成异常
    2. 我使用验证。那是胶带。我的意思是,我永远无法摆脱验证中的所有问题。
    3. 更新(连接池设置)

      <properties>
              <property name="eclipselink.logging.level"                      value="FINE"/>
              <property name="javax.persistence.jdbc.driver"                  value="com.mysql.jdbc.Driver" />
              <property name="javax.persistence.jdbc.url"                     value="jdbc:mysql://127.0.0.1:3307/dbname?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true" />
              <property name="javax.persistence.jdbc.user"                    value="root" />
              <property name="javax.persistence.jdbc.password"                value="*****" />
              <property name="javax.persistence.jdbc.show_sql"                value="true" />
      
              <property name="eclipselink.connection-pool.default.initial"    value="1" />
              <property name="eclipselink.connection-pool.default.min"        value="10" />
              <property name="eclipselink.connection-pool.default.max"        value="20" />
      
              <property name="eclipselink.logging.timestamp"                  value="true"/>
              <property name="eclipselink.logging.thread"                     value="false"/>
              <property name="eclipselink.logging.exceptions"                 value="true"/>
              <property name="eclipselink.logging.logger"                     value="org.eclipse.persistence.logging.CommonsLoggingSessionLog"/>
              <property name="eclipselink.logging.parameters"                 value="true"/>
              <property name="eclipselink.connection-pool.testWhileIdle"      value="true"/>
      
              <property name="eclipselink.jdbc.batch-writing"                 value="JDBC"/>
              <property name="eclipselink.jdbc.batch-writing.size"            value="250"/>
              <property name="eclipselink.jdbc.write-connections.max"         value="20"/>
              <property name="eclipselink.jdbc.exclusive-connection.mode"     value="Always"/>
              <property name="eclipselink.jdbc.exclusive-connection.is-lazy"  value="false"/>
      
      
              <property name="eclipselink.transaction.join-existing"          value="true"/>
              <property name="eclipselink.query-results-cache"                value="false"/>
              <property name="eclipselink.refresh"                            value="true"/>  
              <property name="javax.persistence.validation.mode"              value="AUTO" /> 
          </properties>
      

1 个答案:

答案 0 :(得分:0)

不是答案,但您并不孤单,是的,我可能在做错误的事情,并使用了2.6.4版 我对命名查询(SE应用程序-不在容器中)存在相同的问题。 EclipseLink ConnectionPool进入Object.wat,因为它达到“ available + used = max”。 从堆栈转储中,它看起来像“等待”中的一些其他对象,包括“ oracle.jdbc.useThreadLocalBufferCache”。 该查询在冻结第33天之前运行32次(32个EM)(因为最大值默认为32)。 我已经检查了明显的一点:所有EM已关闭,所有事务已提交或回滚。 显然,我可以对其进行更改,以便只有一个EM,但令我感到失望的是EM.close不会释放所有内容,但是我想如果外面的某个对象持有对某个对象的引用(阻止连接返回到该对象)是很棘手的。池。 就像这样: EM创建 列表=命名队列选择-无行/列表为空 EM关闭 从func返回 这里没有开始或结束事务,但是也许应该存在,所以也许我会尝试。