使用JNDI明显慢于persistence.xml中的显式连接(Jetty 9 / Hibernate)

时间:2018-02-28 15:33:28

标签: java hibernate jpa jetty jndi

在独立的Jetty 9.4服务器上,我正在部署一个使用hibernate JPA的应用程序。我观察到以下奇怪的行为(可能不奇怪,我确信我只是错过了一些概念)

如果我在应用程序持久性xml中显式声明了数据库连接属性,那么对于从数据库中读取一些虚拟数据的服务,我会得到15-20毫秒的响应。第一次尝试就像300毫秒一样,然后汇集起来。

如果我使用JNDI数据源并在持久性xml中引用它,我得到1秒的初始响应时间,然后在同一本地环境中它在300-400毫秒之间。

我的问题是那是一种正常行为吗? JNDI总是那么慢还是可能只是一些糟糕的配置?码头实施是否缓慢?

ps我试图将PoolDataSource声明为JNDI资源,但persistence.xml不接受它。

提前感谢您的答案。

的persistence.xml

    <persistence 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"
             version="2.0">
    <persistence-unit name="flapweb">
        <non-jta-data-source>java:comp/env/jdbc/mydatasource</non-jta-data-source>
        <properties>
            <!--property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5433/postgres" />
            <property name="javax.persistence.jdbc.user" value="user" />
            <property name="javax.persistence.jdbc.password" value="password" /-->

            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <!-- DB Dialect -->
            <property name="hibernate.hbm2ddl.auto" value="update" /> <!-- create / create-drop / update -->

            <property name="hibernate.show_sql" value="true" /> <!-- Show SQL in console -->
            <property name="hibernate.format_sql" value="true" /> <!-- Show SQL formatted -->

            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="500" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.idle_test_period" value="2000" />
        </properties>
    </persistence-unit>
</persistence>

数据源JNDI声明

    <?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">


<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="mydatasource" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/mydatasource</Arg>
        <Arg>
            <New class="org.postgresql.ds.PGSimpleDataSource">
                <Set name="databaseName">postgres</Set>
                <Set name="serverName">localhost</Set>
                <Set name="portNumber">5433</Set>
                <Set name="user">user</Set>
                <Set name="password">password</Set>
            </New>
        </Arg>
    </New>

</Configure>

1 个答案:

答案 0 :(得分:0)

好的,经过多次尝试,我找到了解决方案。

Short anwser,我必须使用c3po DataSource作为JNDI资源,因此检索到的连接将始终来自池。我也不需要任何hibernate.c3p0。*设置。示例:https://www.eclipse.org/jetty/documentation/9.4.x/jndi-datasource-examples.html#c3p0-datasource。 c3po和postgres罐子需要在码头类路径上。

我之前的解决方案无效的原因是因为看起来hibernate没有将任何c3po /连接池设置应用于JNDI检索的数据源,因为它假定它由应用服务器/ servlet容器管理。

我也无法使用PGConnectionPoolDataSource,因为该类没有实现javax.sql.DataSource,因此无法在持久性xml中引用它。

我希望这将有助于将来。