开源github中国开源社区为什么放弃BoneCP

boneCP无法连接RAC数据库问题?
生产环境的数据库是用了RAC方式,请问,怎么配置可以连接上?
什么异常呢,贴出来吧
[12-5-24 7:16:29:775 GMT]
SystemOut & & O
07:16:29 ERROR [com.jolbox.bonecp.ConnectionHandle.obtainInternalConnection(ConnectionHandle.java:215)] WebContainer : 1 - Failed to acquire connection. Sleeping for 7000ms. Attempts left: 5
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:363)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
at oracle.jdbc.driver.PhysicalConnection.&init&(PhysicalConnection.java:468)
at oracle.jdbc.driver.T4CConnection.&init&(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:839)
at java.sql.DriverManager.getConnection(DriverManager.java:562)
at java.sql.DriverManager.getConnection(DriverManager.java:186)
at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:230)
at com.jolbox.bonecp.ConnectionHandle.obtainInternalConnection(ConnectionHandle.java:197)
at com.jolbox.bonecp.ConnectionHandle.&init&(ConnectionHandle.java:154)
at com.jolbox.bonecp.BoneCP.&init&(BoneCP.java:315)
at com.jolbox.bonecp.BoneCPDataSource.maybeInit(BoneCPDataSource.java:127)
at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:89)
&bean id=&dataSource& class=&com.jolbox.bonecp.BoneCPDataSource& destroy-method=&close&&&
&property name=&driverClass& value=&oracle.jdbc.driver.OracleDriver&&&/property&
&property name=&jdbcUrl& value=&jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=101.235.155.97)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=101.235.155.98)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=ON)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME=test)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETIRES=20)(DELAY=15))))&&/property&
&property name=&username& value=&test&&/property&
&property name=&password& value=&pasw&&/property&
&property name=&idleConnectionTestPeriod& value=&60&/&
&property name=&idleMaxAge& value=&240&/&
&property name=&maxConnectionsPerPartition& value=&30&/&
&property name=&minConnectionsPerPartition& value=&10&/&
&property name=&partitionCount& value=&3&/&
&property name=&acquireIncrement& value=&5&/&
&property name=&statementsCacheSize& value=&100&/&
&property name=&releaseHelperThreads& value=&3&/&
& & &/bean&
jdbcUrl 可以这样写?&&&&
如果是C3P0,这样是可以的,但boneCP不知道为什么不行
网络断了?放一个刚写的多数据库连接池MultiDBPool - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 22时,
在BoneCP的基础上再封装了一层 支持多数据库 支持master,slave随机获取 支持动态更新,当配置文件改变后会自动重新加载 默认配置文件名为dbpool.properties,放在classpath下就可以,配置如下:
mediaresource.driverClass=com.mysql.jdbc.Driver
#格式:主机:端口:m/s,m表示master,s表示slave
mediaresource.servers=localhost:3306:m,localhost:3306:m,localhost:3306:s,localhost:3306:s,localhost:3306:s
mediaresource.jdbcUrl=jdbc:mysql://{server}/media_resource?characterEncoding=utf-8&allowMultiQueries=true
mediaresource.username=root
mediaresource.password=
mediaresource.partitionCount=3;
mediaresource.maxConnectionsPerPartition=10
mediaresource.minConnectionsPerPartition=2
mediaresource.acquireIncrement=10
wap.driverClass=oracle.jdbc.driver.OracleDriver
wap.servers=211.94.189.96:1521:m,211.94.189.96:1522:m,211.94.189.96:1523:s,211.94.189.96:1524:s
wap.jdbcUrl=jdbc:oracle:thin:@{server}:jdwwap
wap.username=develop
wap.password=oracle11gdevelop
wap.partitionCount=3
wap.maxConnectionsPerPartition=10
wap.minConnectionsPerPartition=2
wap.acquireIncrement=10
MultiDBPool pool=MultiDBPool.getPool();
for(int i=0;i&10000;i++){
Connection con = pool.getSlaveConnection(&mediaresource&);
Statement stat = con.createStatement();
stat.execute(&select 1;&);
stat.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
代码片段(1)
1.&[代码]刚写的,简单测试了下,有待生产环境验证,希望对兄弟们有用吧&&&&
package ssss.
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.net.URL;
import java.sql.C
import java.sql.SQLE
import java.sql.S
import java.util.ArrayL
import java.util.HashS
import java.util.L
import java.util.P
import java.util.R
import java.util.S
import java.util.Map.E
import java.util.concurrent.ConcurrentHashM
import java.util.concurrent.ConcurrentM
import java.util.concurrent.atomic.AtomicB
import java.util.concurrent.atomic.AtomicL
import com.jolbox.bonecp.BoneCP;
import com.jolbox.bonecp.BoneCPC
public class MultiDBPool {
class PoolGroup {
List&BoneCP&
List&BoneCP&
AtomicBoolean isLoad = new AtomicBoolean();
Random r = new Random();
PoolGroup(String name, Properties p) {
this.name =
this.prop =
BoneCP getMaster() {
if (!isLoad.get()) {
initGroup();
int size = masters.size();
if (size == 1) {
return masters.get(0);
if (size & 1) {
// System.out.println("Master:"+r.nextInt(size));
return masters.get(r.nextInt(size));
BoneCP getSlave() {
if (slaves == null) {
initGroup();
int size = slaves.size();
if (size == 1) {
return slaves.get(0);
if (size & 1) {
// System.out.println("Slave:"+r.nextInt(size));
return slaves.get(r.nextInt(size));
return getMaster();
synchronized void initGroup() {
if (isLoad.get()) {
masters = new ArrayList&BoneCP&(2);
slaves = new ArrayList&BoneCP&(10);
String servers = prop.getProperty("servers");
if (servers != null && servers.trim().length() & 0) {
String ss[] = servers.split("[, ]");
for (String server : ss) {
String s[] = server.trim().split("[:]", 3);
if (s.length & 2) {
String url = prop.getProperty("jdbcUrl").replace(
"{server}", s[0] + ":" + s[1]);
prop.setProperty("jdbcUrl", url);
BoneCPConfig config = new BoneCPConfig(prop);
Class.forName(prop.getProperty("driverClass"));
if (s.length & 2) {
if ("m".equalsIgnoreCase(s[2])) {
masters.add(new BoneCP(config));
if ("s".equalsIgnoreCase(s[2])) {
slaves.add(new BoneCP(config));
masters.add(new BoneCP(config));
} catch (Exception e) {
throw new DBException(e);
isLoad.set(true);
void close() {
if (masters != null) {
for (BoneCP bcp : masters) {
bcp.shutdown();
masters.clear();
if (slaves != null) {
for (BoneCP bcp : slaves) {
bcp.shutdown();
slaves.clear();
if (prop != null) {
prop.clear();
public String toString() {
return String.format("PoolGroup [name=%s, prop=%s]", name, prop);
private static MultiDBP
public static final String DEFAULT_CONFIG_FILE = "dbpool.properties";
private String conf = DEFAULT_CONFIG_FILE;
private File configF
private AtomicLong lastModified = new AtomicLong();
private AtomicBoolean isLoading = new AtomicBoolean();
private static final ConcurrentMap&String, PoolGroup& poolGroups = new ConcurrentHashMap&String, PoolGroup&(
private MultiDBPool() {
loadConfig(conf);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
destory();
private MultiDBPool(String conf) {
this.conf =
loadConfig(conf);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
destory();
private MultiDBPool(Properties properties) {
intiMultiPool(properties);
private void check() {
if (configFile == null
|| configFile.lastModified() != lastModified.get()) {
while (isLoading.get()) {
synchronized (isLoading) {
isLoading.wait();
} catch (InterruptedException e) {
synchronized(isLoading){
loadConfig(conf);
isLoading.notifyAll();
private synchronized void destory() {
for (PoolGroup pg : poolGroups.values()) {
pg.close();
poolGroups.clear();
private void loadConfig(String conf2) {
if (isLoading.get()) {
FileInputStream in =
isLoading.set(true);
URL url = MultiDBPool.class.getClassLoader().getResource(conf2);
if (url == null) {
throw new DBException(conf2 + " not found");
destory();
configFile = new File(url.getFile());
Properties p = new Properties();
in = new FileInputStream(configFile);
p.load(in);
intiMultiPool(p);
lastModified.set(configFile.lastModified());
} catch (IOException e) {
throw new DBException(e);
} finally {
if (in != null) {
in.close();
} catch (IOException e) {
isLoading.set(false);
private void intiMultiPool(Properties prop) {
Set&String& names = new HashSet&String&();
for (String key : prop.stringPropertyNames()) {
int p = key.indexOf(".");
if (p & 0) {
names.add(key.substring(0, p));
for (String name : names) {
Properties p = new Properties();
for (Entry&Object, Object& e : prop.entrySet()) {
String key = e.getKey().toString();
String value = e.getValue().toString();
if (key.startsWith(name)) {
p.setProperty(key.replaceFirst(name + ".", ""), value);
poolGroups.put(name, new PoolGroup(name, p));
System.out.print(name);
p.list(System.out);
public static synchronized MultiDBPool getPool() {
if (pool == null) {
pool = new MultiDBPool();
public static synchronized MultiDBPool getPool(String conf) {
if (pool == null) {
pool = new MultiDBPool(conf);
public Connection getConnection(String dbname) {
return getMasterConnection(dbname);
public Connection getMasterConnection(String dbname) {
PoolGroup pg = poolGroups.get(dbname);
if (pg == null) {
throw new DBException("Database " + dbname + " not config");
BoneCP bcp = pg.getMaster();
if (bcp == null) {
throw new DBException("Database " + dbname + " master not config");
return bcp.getConnection();
} catch (SQLException e) {
throw new DBException(e);
public Connection getSlaveConnection(String dbname) {
PoolGroup pg = poolGroups.get(dbname);
if (pg == null) {
throw new DBException("Database " + dbname + " not config");
BoneCP bcp = pg.getSlave();
if (bcp == null) {
return getMasterConnection(dbname);
return bcp.getConnection();
} catch (SQLException e) {
throw new DBException(e);
public static void main(String... args) {
MultiDBPool pool = MultiDBPool.getPool();
for (int i = 0; i & 10000; i++) {
Connection con = pool.getSlaveConnection("mediaresource");
Statement stat = con.createStatement();
stat.execute("select 1;");
stat.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
开源中国-程序员在线工具:
相关的代码(38)
29回/44011阅
41回/20634阅
41回/17848阅
4回/7481阅
10回/7091阅
3回/5985阅
3回/5461阅
0回/5453阅
1回/5410阅
4回/3191阅
貌似不错,我也在使用BoneCP
2楼:欧德高 发表于
修改了一个高并发下的bug
3楼:张荣 发表于
4楼:poren 发表于
Runtime.getRuntime().addShutdownHook(new Thread(){
对这句不太懂,是怎么个意思,实现了什么保护么?
5楼:james_you 发表于
引用来自“poren”的评论Runtime.getRuntime().addShutdownHook(new Thread(){
对这句不太懂,是怎么个意思,实现了什么保护么?
启动另外一个虚拟机来关闭当前钩子。防止死锁。。。。
6楼:bolean 发表于
连接池问题,不错
开源从代码分享开始
欧德高的其它代码在使用BoneCP的时候发现一个问题,请指点
&&&& 我在使用BoneCP的时候发现一个问题,我更新提交和insert,delete提交没有马上提交到数据库,好像还会有缓存,这个时候马上查询还是旧的数据,等过几秒后查询才是最新的数据,请教各位一下,这个是BoneCP本身设置的问题吗?能马上设置生效吗?谢谢!
BoneCP 只是一个连接池,并不会作缓存的处理,你应该检查一下其他方面的可能性。
好的,谢谢
我也有这问题。我现在用的是BoneCP 0.7.0版本。
现在我的case是:用一个线程专门监视某张表的记录数,如果用BoneCP来查找记录数的话,总是获取不到最真实的记录数。而如果改为用DriverManage的连接去查找记录数就能跟数据库的记录数同步。
我的BoneCP代码如下
private static BoneCP connP
public final static void init() throws Exception{
Class.forName(&com.mysql.jdbc.Driver&);
//设置连接池配置信息
BoneCPConfig config = new BoneCPConfig();
//数据库的JDBC URL
config.setJdbcUrl(&jdbc:mysql://localhost:3306/fly_picture&);
//数据库用户名
config.setUsername(&root&);
//数据库用户密码
config.setPassword(&123456&);
//数据库连接池的最小连接数
config.setMinConnectionsPerPartition(5);
//数据库连接池的最大连接数
config.setMaxConnectionsPerPartition(10);
config.setPartitionCount(1);
//设置数据库连接池
connPool = new BoneCP(config);
public final static Connection getConnection() throws SQLException{
return connPool.getConnection();
DriverManage的代表如下:
public final static void init() throws Exception{
Class.forName(&com.mysql.jdbc.Driver&);
public final static Connection getConnection() throws SQLException{
return DriverManager.getConnection(&jdbc:mysql://localhost:3306/fly_picture&, &root&, &123456&);
请高手帮忙看下,谢谢
我刚尝试使用 BoneCP,也碰到类似问题,目前不清楚怎么解决
感觉数据更新有延时
如果hibernate立即flush就没问题了,是不是和提交的设置有关,这个在那里设置放一个刚写的多数据库连接池MultiDBPool - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 22时,
在BoneCP的基础上再封装了一层 支持多数据库 支持master,slave随机获取 支持动态更新,当配置文件改变后会自动重新加载 默认配置文件名为dbpool.properties,放在classpath下就可以,配置如下:
mediaresource.driverClass=com.mysql.jdbc.Driver
#格式:主机:端口:m/s,m表示master,s表示slave
mediaresource.servers=localhost:3306:m,localhost:3306:m,localhost:3306:s,localhost:3306:s,localhost:3306:s
mediaresource.jdbcUrl=jdbc:mysql://{server}/media_resource?characterEncoding=utf-8&allowMultiQueries=true
mediaresource.username=root
mediaresource.password=
mediaresource.partitionCount=3;
mediaresource.maxConnectionsPerPartition=10
mediaresource.minConnectionsPerPartition=2
mediaresource.acquireIncrement=10
wap.driverClass=oracle.jdbc.driver.OracleDriver
wap.servers=211.94.189.96:1521:m,211.94.189.96:1522:m,211.94.189.96:1523:s,211.94.189.96:1524:s
wap.jdbcUrl=jdbc:oracle:thin:@{server}:jdwwap
wap.username=develop
wap.password=oracle11gdevelop
wap.partitionCount=3
wap.maxConnectionsPerPartition=10
wap.minConnectionsPerPartition=2
wap.acquireIncrement=10
MultiDBPool pool=MultiDBPool.getPool();
for(int i=0;i&10000;i++){
Connection con = pool.getSlaveConnection(&mediaresource&);
Statement stat = con.createStatement();
stat.execute(&select 1;&);
stat.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
代码片段(1)
1.&[代码]刚写的,简单测试了下,有待生产环境验证,希望对兄弟们有用吧&&&&
package ssss.
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.net.URL;
import java.sql.C
import java.sql.SQLE
import java.sql.S
import java.util.ArrayL
import java.util.HashS
import java.util.L
import java.util.P
import java.util.R
import java.util.S
import java.util.Map.E
import java.util.concurrent.ConcurrentHashM
import java.util.concurrent.ConcurrentM
import java.util.concurrent.atomic.AtomicB
import java.util.concurrent.atomic.AtomicL
import com.jolbox.bonecp.BoneCP;
import com.jolbox.bonecp.BoneCPC
public class MultiDBPool {
class PoolGroup {
List&BoneCP&
List&BoneCP&
AtomicBoolean isLoad = new AtomicBoolean();
Random r = new Random();
PoolGroup(String name, Properties p) {
this.name =
this.prop =
BoneCP getMaster() {
if (!isLoad.get()) {
initGroup();
int size = masters.size();
if (size == 1) {
return masters.get(0);
if (size & 1) {
// System.out.println("Master:"+r.nextInt(size));
return masters.get(r.nextInt(size));
BoneCP getSlave() {
if (slaves == null) {
initGroup();
int size = slaves.size();
if (size == 1) {
return slaves.get(0);
if (size & 1) {
// System.out.println("Slave:"+r.nextInt(size));
return slaves.get(r.nextInt(size));
return getMaster();
synchronized void initGroup() {
if (isLoad.get()) {
masters = new ArrayList&BoneCP&(2);
slaves = new ArrayList&BoneCP&(10);
String servers = prop.getProperty("servers");
if (servers != null && servers.trim().length() & 0) {
String ss[] = servers.split("[, ]");
for (String server : ss) {
String s[] = server.trim().split("[:]", 3);
if (s.length & 2) {
String url = prop.getProperty("jdbcUrl").replace(
"{server}", s[0] + ":" + s[1]);
prop.setProperty("jdbcUrl", url);
BoneCPConfig config = new BoneCPConfig(prop);
Class.forName(prop.getProperty("driverClass"));
if (s.length & 2) {
if ("m".equalsIgnoreCase(s[2])) {
masters.add(new BoneCP(config));
if ("s".equalsIgnoreCase(s[2])) {
slaves.add(new BoneCP(config));
masters.add(new BoneCP(config));
} catch (Exception e) {
throw new DBException(e);
isLoad.set(true);
void close() {
if (masters != null) {
for (BoneCP bcp : masters) {
bcp.shutdown();
masters.clear();
if (slaves != null) {
for (BoneCP bcp : slaves) {
bcp.shutdown();
slaves.clear();
if (prop != null) {
prop.clear();
public String toString() {
return String.format("PoolGroup [name=%s, prop=%s]", name, prop);
private static MultiDBP
public static final String DEFAULT_CONFIG_FILE = "dbpool.properties";
private String conf = DEFAULT_CONFIG_FILE;
private File configF
private AtomicLong lastModified = new AtomicLong();
private AtomicBoolean isLoading = new AtomicBoolean();
private static final ConcurrentMap&String, PoolGroup& poolGroups = new ConcurrentHashMap&String, PoolGroup&(
private MultiDBPool() {
loadConfig(conf);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
destory();
private MultiDBPool(String conf) {
this.conf =
loadConfig(conf);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
destory();
private MultiDBPool(Properties properties) {
intiMultiPool(properties);
private void check() {
if (configFile == null
|| configFile.lastModified() != lastModified.get()) {
while (isLoading.get()) {
synchronized (isLoading) {
isLoading.wait();
} catch (InterruptedException e) {
synchronized(isLoading){
loadConfig(conf);
isLoading.notifyAll();
private synchronized void destory() {
for (PoolGroup pg : poolGroups.values()) {
pg.close();
poolGroups.clear();
private void loadConfig(String conf2) {
if (isLoading.get()) {
FileInputStream in =
isLoading.set(true);
URL url = MultiDBPool.class.getClassLoader().getResource(conf2);
if (url == null) {
throw new DBException(conf2 + " not found");
destory();
configFile = new File(url.getFile());
Properties p = new Properties();
in = new FileInputStream(configFile);
p.load(in);
intiMultiPool(p);
lastModified.set(configFile.lastModified());
} catch (IOException e) {
throw new DBException(e);
} finally {
if (in != null) {
in.close();
} catch (IOException e) {
isLoading.set(false);
private void intiMultiPool(Properties prop) {
Set&String& names = new HashSet&String&();
for (String key : prop.stringPropertyNames()) {
int p = key.indexOf(".");
if (p & 0) {
names.add(key.substring(0, p));
for (String name : names) {
Properties p = new Properties();
for (Entry&Object, Object& e : prop.entrySet()) {
String key = e.getKey().toString();
String value = e.getValue().toString();
if (key.startsWith(name)) {
p.setProperty(key.replaceFirst(name + ".", ""), value);
poolGroups.put(name, new PoolGroup(name, p));
System.out.print(name);
p.list(System.out);
public static synchronized MultiDBPool getPool() {
if (pool == null) {
pool = new MultiDBPool();
public static synchronized MultiDBPool getPool(String conf) {
if (pool == null) {
pool = new MultiDBPool(conf);
public Connection getConnection(String dbname) {
return getMasterConnection(dbname);
public Connection getMasterConnection(String dbname) {
PoolGroup pg = poolGroups.get(dbname);
if (pg == null) {
throw new DBException("Database " + dbname + " not config");
BoneCP bcp = pg.getMaster();
if (bcp == null) {
throw new DBException("Database " + dbname + " master not config");
return bcp.getConnection();
} catch (SQLException e) {
throw new DBException(e);
public Connection getSlaveConnection(String dbname) {
PoolGroup pg = poolGroups.get(dbname);
if (pg == null) {
throw new DBException("Database " + dbname + " not config");
BoneCP bcp = pg.getSlave();
if (bcp == null) {
return getMasterConnection(dbname);
return bcp.getConnection();
} catch (SQLException e) {
throw new DBException(e);
public static void main(String... args) {
MultiDBPool pool = MultiDBPool.getPool();
for (int i = 0; i & 10000; i++) {
Connection con = pool.getSlaveConnection("mediaresource");
Statement stat = con.createStatement();
stat.execute("select 1;");
stat.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
开源中国-程序员在线工具:
相关的代码(38)
29回/44011阅
41回/20634阅
41回/17848阅
4回/7481阅
10回/7091阅
3回/5985阅
3回/5461阅
0回/5453阅
1回/5410阅
4回/3191阅
貌似不错,我也在使用BoneCP
2楼:欧德高 发表于
修改了一个高并发下的bug
3楼:张荣 发表于
4楼:poren 发表于
Runtime.getRuntime().addShutdownHook(new Thread(){
对这句不太懂,是怎么个意思,实现了什么保护么?
5楼:james_you 发表于
引用来自“poren”的评论Runtime.getRuntime().addShutdownHook(new Thread(){
对这句不太懂,是怎么个意思,实现了什么保护么?
启动另外一个虚拟机来关闭当前钩子。防止死锁。。。。
6楼:bolean 发表于
连接池问题,不错
开源从代码分享开始
欧德高的其它代码

我要回帖

更多关于 码云 开源中国 的文章

 

随机推荐