将Hibernate 4.3.11与H2 1.4.199和C3p0一起使用

如果仍然可以将Hibernate与数据库一起使用,并且可以安全地绕过Hibernate直接从池中获取连接?

我正在尝试编写一个SQL查询,现在我知道我可以使用session.createSQLQuery()了,但这会返回一个Hibernate org.hibernate SQLQuery类而不是java.sql.Connection,这给我尝试设置参数带来了问题,因此我想尝试改用Connection。

===============>>#1 票数:1 已采纳

尝试这个。

import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;  sessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(ConnectionProvider.class).getConnection(); 

我尚未对此进行测试,目前无法做到。 我在ConnectionProvider上只有50-50,因为我不确定c3p0的提供程序类是什么。 可能是org.hibernate.c3p0.internal.C3P0ConnectionProvider或您已经知道。

编辑11-10-2019

据我所知,这些连接是从org.hibernate.engine.jdbc.connections.spi.ConnectionProvider接口的实现返回的。

org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl 

这两种实现都是从服务注册时内部维护的Datasource或PooledConnections中获取java.sql.Connection

DatasourceConnectionProviderImpl具有以下方法。

    @Override     public Connection getConnection() throws SQLException {         if ( !available ) {             throw new HibernateException( "Provider is closed!" );         }         return useCredentials ? dataSource.getConnection( user, pass ) : dataSource.getConnection();     }      @Override     public void closeConnection(Connection connection) throws SQLException {         connection.close();     } 

遵循DriverManagerConnectionProviderImpl方法

@Override public Connection getConnection() throws SQLException {     if ( !active ) {         throw new HibernateException( "Connection pool is no longer active" );     }      return pool.poll(); }  public Connection poll() throws SQLException {         Connection conn = availableConnections.poll();         if ( conn == null ) {             synchronized (allConnections) {                 if(allConnections.size() < maxSize) {                     addConnections( 1 );                     return poll();                 }             }             throw new HibernateException( "The internal connection pool has reached its maximum size and no connection is currently available!" );         }         conn.setAutoCommit( autoCommit );         return conn;     }   @Override public void closeConnection(Connection conn) throws SQLException {     if (conn == null) {         return;     }      pool.add( conn ); } 

如您所见,它们都有不同的连接处理方式。 如果关闭连接,我将不会遇到重大问题,因为第一个连接将返回新的连接,第二个连接将在连接关闭时补充池。 但是,如果您不打算关闭,请知道在应用程序中正在调用哪个实现,并确保没有泄漏。

其他两个实现是针对Hikari和UserSupplied模式的。

  ask by Paul Taylor translate from so

本文未有回复,本站智能推荐: