引发几个疑问啊。
问题1:
使用数据库连接池得到的connection是不用程序关闭,连接池自己会把一定时间内没有使用的connection拿回到池里。----然后,我不知道这句话对不对。如果对,那么在spring中,hibernate中,很多都用了ThreadLocal来控制多线程中的事务,这样不会就有问题了吗?---连接池把con分给这个线程使用,放在ThreadLocal中,而一回收后又交给其他线程使用,放在ThreadLocal中,要是这些线程同时要做事务,同一个connection那还如何事务?
问题2:
人家都说调用connection的close()方法没关系,不会被关,怎么不会被关啊?
sun api文档方法说明:
[quote]void close()
Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released. [/quote]
如果我没理解错,调用此方法是主动去释放这个连接的资源,以代替数据库或者jdbc自动释放,不就是关闭吗?
除非是从数据库连接池里get到的connection是经过包装的。
比如
而连接池的代码,得到connection实际是它的子类MyConnection
我懒人一个,没去看开源的数据库连接池代码。不知以上的观点对不对,或者还有其他机制,或者我想得根本不对!
有人知道其真正原理吗?能讨论下原理吗?
问题1:
使用数据库连接池得到的connection是不用程序关闭,连接池自己会把一定时间内没有使用的connection拿回到池里。----然后,我不知道这句话对不对。如果对,那么在spring中,hibernate中,很多都用了ThreadLocal来控制多线程中的事务,这样不会就有问题了吗?---连接池把con分给这个线程使用,放在ThreadLocal中,而一回收后又交给其他线程使用,放在ThreadLocal中,要是这些线程同时要做事务,同一个connection那还如何事务?
问题2:
人家都说调用connection的close()方法没关系,不会被关,怎么不会被关啊?
sun api文档方法说明:
[quote]void close()
Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released. [/quote]
如果我没理解错,调用此方法是主动去释放这个连接的资源,以代替数据库或者jdbc自动释放,不就是关闭吗?
除非是从数据库连接池里get到的connection是经过包装的。
比如
class MyConnection extends java.sql.Connection
{
@override
public void close()
{
//回收到连接池里
}
}
而连接池的代码,得到connection实际是它的子类MyConnection
class ConnectionPool ..
{
...
public Conncetion getConnection()
{
return new MyConnection(...);
}
...
}
硬是把close方法重写了,这样调用close时就不会被真正关闭。我懒人一个,没去看开源的数据库连接池代码。不知以上的观点对不对,或者还有其他机制,或者我想得根本不对!
有人知道其真正原理吗?能讨论下原理吗?