【问题标题】:how to define hibernate.c3p0 connection Pool in wildfly 10 standalone.xml如何在wildfly 10 Standalone.xml中定义hibernate.c3p0连接池
【发布时间】:2016-11-30 12:08:56
【问题描述】:

长时间空闲后,我遇到了与 Mysql DB 连接断开的问题,即我收到不同类型的错误,包括“允许的最大数据包大小”错误、“在 8499970 毫秒前收到的最后一个数据包”错误等。 我正在将 Hibernate-JPA 与 JPA 2.0 版一起使用

目前我的 Wildfly Standalone.xml 中的数据源配置是:

<datasources>

                <datasource jndi-name="java:/MySQLDS" pool-name="MySQLDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://localhost:3306/opera</connection-url>
                    <driver>mysqlDriver</driver>
                    <security>
                        <user-name>admin</user-name>
                        <password>admin</password>
                    </security>
                </datasource>
                <drivers>

                    <driver name="mysqlDriver" module="com.mysql">
                        <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>

persistence.xml 文件如下所示:

 <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="metadatatool-persistence">
         <jta-data-source>java:/MySQLDS</jta-data-source>
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
                <!-- Hibernate properties -->
                <property name="hibernate.show_sql" value="false" />
                <property name="hibernate.format_sql" value="false" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />


                <!-- Configuring Connection Pool -->
                <property name="hibernate.c3p0.min_size" value="5" />
                <property name="hibernate.c3p0.max_size" value="20" />
                <property name="hibernate.c3p0.timeout" value="600" />
                <property name="hibernate.c3p0.max_statements" value="2000" />
                <property name="hibernate.c3p0.idle_test_period" value="30" />
                <property name="hibernat.c3p0.automaticTestTable" value="conTestTable" />
            </properties>
    </persistence-unit>
    </persistence>

我已将 c3p0-4.1.1-final Jar 包含在我的项目中,但它看起来不起作用我在空闲时间后仍然没有收到任何连接错误,而且我无法在任何地方找到合适的分步解决方案

编辑

我在我的 persistence.xml 中定义了另一个属性,我不知道它是否会起作用

<property name="hibernate.connection.url"
                value="jdbc:mysql://192.168.1.1:3306/opera?zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true;reconnectAtTxEnd=true;autoReconnectForPools=true" />
        <property name="hibernate.connection.username" value="root" />

编辑更新 我使用了上面定义的属性,现在我没有收到连接错误,但是我确实在下面的日志文件中发现了一个错误,但部署工作正常

error is:  java.lang.IllegalStateException: UT000010: Session not found BDnAhOKBakcD8h9izG1Dembs0DFHWwWgYFVYPEKm

我在这个属性中使用的连接字符串也是正确的方法吗?我会面临哪些副作用?

【问题讨论】:

  • 为什么您使用 xa-datasource-class ,因为您不使用 xa-datasource 并且只有一个持久性单元?
  • 这是我在他们的一个文档中找到的关于如何在 wildfly 中定义数据源的设置,另一个步骤是将 MySqlConnectorJ 放在“模块”目录下

标签: java mysql hibernate jpa wildfly


【解决方案1】:

没有必要在任何完整的 Java EE 实现中配置自己的连接池实现(例如 c3po),例如 WildFly/JBoss EAP、WebSphere、GlassFish 等。

所有这些服务器都为您提供连接池实现和管理工具来配置它们。

在 WildFly 中,您可以使用管理控制台中的 DataSource 配置或使用 CLI 进行设置。见WildFly 10 DataSource configuration

您应该能够将您的 persistence.xml 减少到:

<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="metadatatool-persistence">
        <jta-data-source>java:/MySQLDS</jta-data-source>
        <properties>
            <!-- Hibernate properties -->
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />
        </properties>
    </persistence-unit>
</persistence>

为了方便起见,我将 SQL 生成属性留在那里,尽管在 false 一直都不需要它们。

在此之后,您需要确保您的 DataSource 配置正确。

<datasource jta="true" 
            jndi-name="java:/MySQLDS"
            pool-name="MySQLDS" enabled="true" use-ccm="true">
    <connection-url>jdbc:mysql://localhost:3306/opera</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver> mysqlDriver </driver>
    <security>
        <user-name>admin</user-name>
        <password>admin</password>
    </security>
    <validation>
        <valid-connection-checker
            class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
        <background-validation>true</background-validation>
        <exception-sorter
            class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
    </validation>
</datasource>

请注意您缺少的连接验证配置。这是在通过管理控制台设置 DataSource 时免费添加的。

永远不要手动修改standalone.xml 文件。

【讨论】:

  • 但是当我将它部署在服务器上时,大约 8 小时不活动后,与数据库的连接会自行关闭,当我搜索它时,我只发现 Hibernate 的连接池是既不是生产也不是性能测试,我应该使用第三方连接池,其中之一是 C3p0。那我在我的数据源中做错了吗?
  • 上面的解决方案是不使用“Hibernate 连接池”;它使用的是 WildFly 提供的连接池实现。 WildFly 是您的“第三方连接池”。您可能会在 old 版本的 Tomcat 中使用类似 c3po 的东西,它自己有一种糟糕的连接池实现。
【解决方案2】:

这是我通常做的:

<jee:jndi-lookup id="dataSource" jndi-name="java:/MySQLDS"/>

然后像这样在持久化上下文中使用数据源:

 <property name="dataSource" ref="dataSource"/>

看看spring docs

【讨论】:

  • 但是在哪里定义 hibernate.c3p0 呢?他们没有通过在 persistence.xml 中定义它们来工作,我也没有使用弹簧框架。 Wildfly 10 中是否有针对 hibernate.c3p0 的特定设置???
  • 不知道...但是我看到您的 persistence.xml 中没有数据源
  • 尝试在属性前添加 java:/MySQLDS
  • 它已经在我的文件中我在问题中添加它时错过了它但是我现在也添加了它我的实体包含在persistence.xml中它们太多了所以我没有将它们包括在问题中。问题是在大约 6-8 小时的长时间空闲时间后,与数据库的连接自行关闭。正常使用时效果很好
  • 如果连接突然断开,您可以添加以下代码重新连接
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 2021-10-14
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多