C3P0 ComboPooledDataSource.getConnection 方法在部署后带空
C3P0 ComboPooledDataSource.getConnection method bring null after deployment
这是我的 c3p0 配置代码...
当应用服务器启动时,我正在初始化来自 dbDef(db definitions table)
的数据源
SessionFactory sessionFactoryByServer;
Connection jdbcConnectionC3P0;
List<Map<String, Object>> connectionSourceList; // object combopooleddatasource
@PostConstruct
public void init() {
List <DBDef> dbDefs = new ArrayList<DBDef>();
try {
dbDefs = getAllServerIpAddresses();
} catch (SQLException e) {
e.printStackTrace();
}
connectionSourceList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < dbDefs.size(); i++) {
try {
Map<String, Object> cpdsMap = new HashMap<String, Object>();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDebugUnreturnedConnectionStackTraces(false);
cpds.setDriverClass(dbDefs.get(i).getDriver());
cpds.setJdbcUrl(dbDefs.get(i).getConnectionURL());
cpds.setUser(dbDefs.get(i).getUserName());
cpds.setPassword(dbDefs.get(i).getPassword());
cpds.setDataSourceName(dbDefs.get(i).getIpAddress());
cpds.setAcquireIncrement(5);
cpds.setIdleConnectionTestPeriod(1800);
cpds.setMinPoolSize(10);
cpds.setAcquireRetryAttempts(1);
cpds.setPreferredTestQuery("SELECT 1");
cpds.setMaxPoolSize(50);
Configuration cfg = new Configuration();
cfg.configure(dbDefs.get(i).getHbmCfgXmlPath());
cfg.setProperty("connection.provider_class", dbDefs.get(i).getConnectionProvideClass())
.setProperty("hibernate.c3p0.acquire_increment", dbDefs.get(i).getAcquireIncrement())
.setProperty("hibernate.c3p0.max_size", dbDefs.get(i).getMaxSize())
.setProperty("hibernate.c3p0.min_size", dbDefs.get(i).getMinSize())
.setProperty("hibernate.c3p0.timeout", dbDefs.get(i).getTimeout())
.setProperty("hibernate.c3p0.max_statements", dbDefs.get(i).getMaxStatements())
.setProperty("hibernate.c3p0.idle_test_period", dbDefs.get(i).getIdleTestPeriod())
.setProperty("hibernate.show_sql", "true");
ServiceRegistryBuilder ssrb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
SessionFactory sessionFactory = cfg.buildSessionFactory(ssrb.buildServiceRegistry());
cpdsMap.put("serverIp", dbDefs.get(i).getIpAddress());
cpdsMap.put("dataSource", cpds);
cpdsMap.put("sessionFactory", sessionFactory);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
}
将 c3p0 数据源初始化为 List<Map<String, Object>> connectionSourceList;
后,当我想按顺序从 3 个数据库中收集一些数据时,在这个列表中,第三个忘记了它的一些属性,我认为。这是发生的问题。
private SessionFactory retCurSessionFactory(String ipAddress) throws SQLException {
SessionFactory currentSessionFactory = null;
for (Map<String, Object> cpdsMap : connectionSourceList) {
sessionFactoryByServer = (SessionFactory)cpdsMap.get("sessionFactory");
jdbcConnectionC3P0 = ((ComboPooledDataSource)cpdsMap.get("dataSource")).getConnection();//getConnection brings null here, but only in app server not in my local machine.
currentSessionFactory = (SessionFactory)cpdsMap.get("sessionFactory");
}
}
return currentSessionFactory;
}
getConnection 方法在应用程序服务器 运行 时程序调用此方法时返回 null。 Tomcat 与开发环境相同。(复制粘贴)
我的位置和应用程序服务器之间的互联网连接有时会中断几毫秒,在我发现这个 getConnection 为空之前,我在下面得到了这个堆栈跟踪...
2016-03-28 19:00:21 信息 AbstractPoolBackedDataSource:2016-03-28 19:00:22 警告 BasicResourcePool:org.postgresql.util.PSQLException:致命:否 pg_hba.conf 主机条目 "xx.xxx.xx.x",用户“用户名
",数据库 "xxxx",SSL 关闭
和
java.sql.SQLException: 无法从底层数据库获取连接!
编辑:添加了 hba 配置内容。
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host raritan +odbc 0.0.0.0/0 md5
我在从 dbDef 对象启动 ComboPooledDataSource 对象时发现一个错误。我在数据库中创建了一个新行,在那里我获得了连接属性。 DB 行的定义中必须有一个 space 字符。所以这段代码对我动态启动数据库连接很有效。
这是我的 c3p0 配置代码... 当应用服务器启动时,我正在初始化来自 dbDef(db definitions table)
的数据源SessionFactory sessionFactoryByServer;
Connection jdbcConnectionC3P0;
List<Map<String, Object>> connectionSourceList; // object combopooleddatasource
@PostConstruct
public void init() {
List <DBDef> dbDefs = new ArrayList<DBDef>();
try {
dbDefs = getAllServerIpAddresses();
} catch (SQLException e) {
e.printStackTrace();
}
connectionSourceList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < dbDefs.size(); i++) {
try {
Map<String, Object> cpdsMap = new HashMap<String, Object>();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDebugUnreturnedConnectionStackTraces(false);
cpds.setDriverClass(dbDefs.get(i).getDriver());
cpds.setJdbcUrl(dbDefs.get(i).getConnectionURL());
cpds.setUser(dbDefs.get(i).getUserName());
cpds.setPassword(dbDefs.get(i).getPassword());
cpds.setDataSourceName(dbDefs.get(i).getIpAddress());
cpds.setAcquireIncrement(5);
cpds.setIdleConnectionTestPeriod(1800);
cpds.setMinPoolSize(10);
cpds.setAcquireRetryAttempts(1);
cpds.setPreferredTestQuery("SELECT 1");
cpds.setMaxPoolSize(50);
Configuration cfg = new Configuration();
cfg.configure(dbDefs.get(i).getHbmCfgXmlPath());
cfg.setProperty("connection.provider_class", dbDefs.get(i).getConnectionProvideClass())
.setProperty("hibernate.c3p0.acquire_increment", dbDefs.get(i).getAcquireIncrement())
.setProperty("hibernate.c3p0.max_size", dbDefs.get(i).getMaxSize())
.setProperty("hibernate.c3p0.min_size", dbDefs.get(i).getMinSize())
.setProperty("hibernate.c3p0.timeout", dbDefs.get(i).getTimeout())
.setProperty("hibernate.c3p0.max_statements", dbDefs.get(i).getMaxStatements())
.setProperty("hibernate.c3p0.idle_test_period", dbDefs.get(i).getIdleTestPeriod())
.setProperty("hibernate.show_sql", "true");
ServiceRegistryBuilder ssrb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
SessionFactory sessionFactory = cfg.buildSessionFactory(ssrb.buildServiceRegistry());
cpdsMap.put("serverIp", dbDefs.get(i).getIpAddress());
cpdsMap.put("dataSource", cpds);
cpdsMap.put("sessionFactory", sessionFactory);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
}
将 c3p0 数据源初始化为 List<Map<String, Object>> connectionSourceList;
后,当我想按顺序从 3 个数据库中收集一些数据时,在这个列表中,第三个忘记了它的一些属性,我认为。这是发生的问题。
private SessionFactory retCurSessionFactory(String ipAddress) throws SQLException {
SessionFactory currentSessionFactory = null;
for (Map<String, Object> cpdsMap : connectionSourceList) {
sessionFactoryByServer = (SessionFactory)cpdsMap.get("sessionFactory");
jdbcConnectionC3P0 = ((ComboPooledDataSource)cpdsMap.get("dataSource")).getConnection();//getConnection brings null here, but only in app server not in my local machine.
currentSessionFactory = (SessionFactory)cpdsMap.get("sessionFactory");
}
}
return currentSessionFactory;
}
getConnection 方法在应用程序服务器 运行 时程序调用此方法时返回 null。 Tomcat 与开发环境相同。(复制粘贴) 我的位置和应用程序服务器之间的互联网连接有时会中断几毫秒,在我发现这个 getConnection 为空之前,我在下面得到了这个堆栈跟踪...
2016-03-28 19:00:21 信息 AbstractPoolBackedDataSource:2016-03-28 19:00:22 警告 BasicResourcePool:org.postgresql.util.PSQLException:致命:否 pg_hba.conf 主机条目 "xx.xxx.xx.x",用户“用户名 ",数据库 "xxxx",SSL 关闭
和
java.sql.SQLException: 无法从底层数据库获取连接!
编辑:添加了 hba 配置内容。
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host raritan +odbc 0.0.0.0/0 md5
我在从 dbDef 对象启动 ComboPooledDataSource 对象时发现一个错误。我在数据库中创建了一个新行,在那里我获得了连接属性。 DB 行的定义中必须有一个 space 字符。所以这段代码对我动态启动数据库连接很有效。