如何避免与 TomEE 的 JDBC 连接池的数据库连接停滞?
How to avoid stalled DB connections with TomEE's JDBC connection pool?
我正在 TomEE1.7.2(通过 tomcat7、javaEE6)创建一个 JSF 网络应用程序。
我有 JDBC 到 mysql5.6.23 连接设置,如下所示,
它工作得很好,只有几个小时。
我的数据访问超级class:
public class BaseDao {
@javax.ejb.EJB
MyEnvironmentService env;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-stg")
protected javax.persistence.EntityManager em_stg;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-prd")
protected javax.persistence.EntityManager em_prd;
protected javax.persistence.EntityManager em;
@javax.annotation.PostConstruct
private void init(){
switch (env.getName()){
case "stg":
em = em_stg;
break;
case "prd":
em = em_prd;
break;
default:
throw new RuntimeException("Oh no!");
}
}
}
我的数据访问 class:
@javax.ejb.Stateless
public class MyDao extends BaseDao{
public MyEntity find(Object id) {
return em.find(MyEntity.class, id);
}
}
我的META-INF/persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistence-unit-stg" transaction-type="JTA">
<jta-data-source>mysql-jdbc-jta-resource-stg</jta-data-source>
</persistence-unit>
<!-- almost same persistence-unit for prd -->
</persistence>
我的WEB-INF/resource.xml:
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname
UserName username
password password
jtaManaged true
</Resource>
<!-- almost same Resource for prd -->
</resources>
我有 2 个问题需要解决:
1。
当我在暂存环境中启动我的 Web 应用程序时,离开它,mysql "wait_timeout" 出现,我的 Web 应用程序得到
javax.transaction.RollbackException: Transaction is marked for rollback
并且无法永远重新连接到 mysql。
我已经尝试了一些 JDBC 的
autoreconnect=true 或 autoreconnectForPool=true
事情,也没有用,我觉得这不是最好的事情,首先(功能已经弃用?)。
2。
当我启动我的网络应用程序时,我看到恰好有 3 个连接连接到 mysql,
每次,似乎只使用了一个连接并延长了它的超时时间,
但其他 2 个从未在 "wait_timeout" 处被使用和杀死。
我试过 "initialSize 10",它带有 15 个连接,
同样,只使用了一个连接。
我猜他们有一个非常简单的解决方案,
因为它说:
Internally, from TomEE 1.5.0, JDBC pools are managed via Tomcat-pool.
在此页面中 http://tomee.apache.org/common-datasource-configurations.html
嗯,是的,我确实想使用这个 Tomcat JDBC 池(或者其他替代方法也可以。),它似乎没有启用。
可能是我缺少一些 xml 设置或 jar 或其他什么,但我不知道。
请帮帮我。
我在我的 WEB-INF
文件夹中成功地使用了一个 resources.xml
,类似于我的生产项目中的这个:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource">
JtaManaged = true
DataSourceCreator = tomcat
validationQuery = SELECT 1
initialSize = 2
removeAbandoned = true
removeAbandonedTimeout = 120
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname
username = your-username
password = your-pw
</Resource>
</resources>
一个重要的区别是使用 DataSourceCreator = tomcat
。这可确保 TomEE 创建一个池,负责连接验证 ("SELECT 1") 并删除 stalled/outdated 连接,从而释放后台资源。
相比之下,DataSourceCreator = dbpc
(未设置时为默认:“默认提供的池是 DBCP...") 表现得像你 described/experienced 它(超时,...)。检查 related documentation 以了解更多差异。
另请注意,我的工作配置中使用了 =
。我发现在以前的 TomEE 版本中它似乎在没有 =
的情况下也能工作。但是,当您的目标应用程序服务器是 TomEE 1.7.2 或更高版本时,我建议始终使用 =
配置。
有关这方面的更多详细信息,也可以在 DataSource Configuration 页面中找到。
希望对您有所帮助。
我正在 TomEE1.7.2(通过 tomcat7、javaEE6)创建一个 JSF 网络应用程序。 我有 JDBC 到 mysql5.6.23 连接设置,如下所示, 它工作得很好,只有几个小时。
我的数据访问超级class:
public class BaseDao {
@javax.ejb.EJB
MyEnvironmentService env;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-stg")
protected javax.persistence.EntityManager em_stg;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-prd")
protected javax.persistence.EntityManager em_prd;
protected javax.persistence.EntityManager em;
@javax.annotation.PostConstruct
private void init(){
switch (env.getName()){
case "stg":
em = em_stg;
break;
case "prd":
em = em_prd;
break;
default:
throw new RuntimeException("Oh no!");
}
}
}
我的数据访问 class:
@javax.ejb.Stateless
public class MyDao extends BaseDao{
public MyEntity find(Object id) {
return em.find(MyEntity.class, id);
}
}
我的META-INF/persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistence-unit-stg" transaction-type="JTA">
<jta-data-source>mysql-jdbc-jta-resource-stg</jta-data-source>
</persistence-unit>
<!-- almost same persistence-unit for prd -->
</persistence>
我的WEB-INF/resource.xml:
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname
UserName username
password password
jtaManaged true
</Resource>
<!-- almost same Resource for prd -->
</resources>
我有 2 个问题需要解决:
1。 当我在暂存环境中启动我的 Web 应用程序时,离开它,mysql "wait_timeout" 出现,我的 Web 应用程序得到
javax.transaction.RollbackException: Transaction is marked for rollback
并且无法永远重新连接到 mysql。 我已经尝试了一些 JDBC 的 autoreconnect=true 或 autoreconnectForPool=true 事情,也没有用,我觉得这不是最好的事情,首先(功能已经弃用?)。
2。 当我启动我的网络应用程序时,我看到恰好有 3 个连接连接到 mysql, 每次,似乎只使用了一个连接并延长了它的超时时间, 但其他 2 个从未在 "wait_timeout" 处被使用和杀死。 我试过 "initialSize 10",它带有 15 个连接, 同样,只使用了一个连接。
我猜他们有一个非常简单的解决方案, 因为它说:
Internally, from TomEE 1.5.0, JDBC pools are managed via Tomcat-pool.
在此页面中 http://tomee.apache.org/common-datasource-configurations.html
嗯,是的,我确实想使用这个 Tomcat JDBC 池(或者其他替代方法也可以。),它似乎没有启用。 可能是我缺少一些 xml 设置或 jar 或其他什么,但我不知道。 请帮帮我。
我在我的 WEB-INF
文件夹中成功地使用了一个 resources.xml
,类似于我的生产项目中的这个:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource">
JtaManaged = true
DataSourceCreator = tomcat
validationQuery = SELECT 1
initialSize = 2
removeAbandoned = true
removeAbandonedTimeout = 120
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname
username = your-username
password = your-pw
</Resource>
</resources>
一个重要的区别是使用 DataSourceCreator = tomcat
。这可确保 TomEE 创建一个池,负责连接验证 ("SELECT 1") 并删除 stalled/outdated 连接,从而释放后台资源。
相比之下,DataSourceCreator = dbpc
(未设置时为默认:“默认提供的池是 DBCP...") 表现得像你 described/experienced 它(超时,...)。检查 related documentation 以了解更多差异。
另请注意,我的工作配置中使用了 =
。我发现在以前的 TomEE 版本中它似乎在没有 =
的情况下也能工作。但是,当您的目标应用程序服务器是 TomEE 1.7.2 或更高版本时,我建议始终使用 =
配置。
有关这方面的更多详细信息,也可以在 DataSource Configuration 页面中找到。
希望对您有所帮助。