hibernate Multi-tenancy多租户为什么connection总是空指针?
运行错误详情
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:73)
at com.qzd.hibernate.MultiTenantConnectionProviderImpl.getAnyConnection(MultiTenantConnectionProviderImpl.java:65)
at com.qzd.hibernate.MultiTenantConnectionProviderImpl.getConnection(MultiTenantConnectionProviderImpl.java:78)
at org.hibernate.internal.AbstractSessionImpl$ContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:429)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:84)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:109)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:227)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:234)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:214)
at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1525)
at com.qzd.hibernate.TestMultiTenancy.main(TestMultiTenancy.java:40)
hibernate.cfg.xml配置
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_entries">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<property name="net.sf.ehcache.configurationResourceName">ehcache.xml</property>
<property name="hibernate.connection.provider_class">
org.hibernate.c3p0.internal.C3P0ConnectionProvider
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/hibernate
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">
,an.123;kun
</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">1500</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/hibernate
</property>
<property name="connection.username">root</property>
<property name="connection.password">,an.123;kun</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.multiTenancy">shema</property>
<property name="hibernate.multi_tenant_connection_provider">com.qzd.hibernate.MultiTenantConnectionProviderImpl</property>
<mapping resource="com/qzd/hibernate/People.hbm.xml" />
<mapping resource="com/qzd/hibernate/Wife.hbm.xml" />
<mapping resource="com/qzd/hibernate/Child.hbm.xml" />
<mapping resource="com/qzd/hibernate/Address.hbm.xml" />
<mapping resource="com/qzd/hibernate/Person.hbm.xml" />
<mapping resource="com/qzd/hibernate/Tempbook.hbm.xml" />
<mapping resource="com/qzd/hibernate/Tempkind.hbm.xml" />
</session-factory>
</hibernate-configuration>
package com.qzd.hibernate;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.HibernateException;
import org.hibernate.c3p0.internal.C3P0ConnectionProvider;
import org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.Stoppable;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider,Configurable,Stoppable,ServiceRegistryAwareService{
private C3P0ConnectionProvider connectionProvider=new C3P0ConnectionProvider();
@Override
public boolean isUnwrappableAs(Class arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T> arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
@Override
public Connection getAnyConnection() throws SQLException {
Connection conn = null;
try {
conn = connectionProvider.getConnection();
} catch (SQLException e) {
throw new SQLException(e);
} finally {
System.out.println("222222222222222222888888888::" + (conn == null));
}
return connectionProvider.getConnection();
}
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
try {
connection.createStatement().execute( "USE " + tenantIdentifier );
}
catch ( SQLException exception ) {
throw new HibernateException(
"Could not alter JDBC connection to specified schema [" +tenantIdentifier + "]",
exception
);
}
return connection;
}
@Override
public void releaseAnyConnection(Connection connection) throws SQLException {
connectionProvider.closeConnection(connection);
}
@Override
public void releaseConnection(String tenantIdentifier, Connection connection)throws SQLException {
try {
connection.createStatement().execute( "USE antest" );
}
catch ( SQLException exception) {
throw new HibernateException(
"Could not alter JDBC connection to specified schema [" +
tenantIdentifier + "]",
exception
);
}
connectionProvider.closeConnection( connection );
}
@Override
public boolean supportsAggressiveRelease() {
// TODO Auto-generated method stub
return false;
}
@Override
public void configure(Map props) {
Properties c3props = new Properties();
Map allProps = new HashMap();
allProps.putAll( props );
allProps.putAll( c3props );
}
@Override
public void injectServices(ServiceRegistryImplementor arg0) {
// TODO Auto-generated method stub
}
}
测试文件代码
package com.qzd.hibernate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.query.AuditQuery;
import com.qzd.shop.web.bean.Book;
public class TestMultiTenancy {
public static void main(String args[]) {
Configuration config = new Configuration();
StandardServiceRegistryBuilder standardRegistryBuilder = new StandardServiceRegistryBuilder();
standardRegistryBuilder.configure("hibernate.cfg.xml").applySetting(
"hibernate.multiTenancy",
org.hibernate.MultiTenancyStrategy.SCHEMA);
StandardServiceRegistry standardRegistry = standardRegistryBuilder
.build();
SessionFactory sessionFactory = config
.buildSessionFactory(standardRegistry);
Session session = sessionFactory.withOptions()
.tenantIdentifier("hibernate").openSession();
Transaction trans = session.beginTransaction();
try {
Query query=session.createQuery("select new list(book.bookName,book.author,book.price) from Book book where book.bookId=3");
query.list().forEach((c)->System.out.println(c));
trans.commit();
} catch (Exception ex) {
try {
trans.rollback();
} catch (HibernateException e) {
System.out.print(e.getMessage());
}
System.out.println(ex.getMessage());
} finally {
session.close();
sessionFactory.close();
}
}
}
求大神解答,不胜感激。