Java 连接池
我们计划实现连接池,因为这似乎是在数据库连接频繁打开和关闭时使用的正确机制。我们在下面显示了我们的代码,但需要知道我们必须在哪里执行连接池定义。它应该在Java 连接池,java,connection-pooling,Java,Connection Pooling,我们计划实现连接池,因为这似乎是在数据库连接频繁打开和关闭时使用的正确机制。我们在下面显示了我们的代码,但需要知道我们必须在哪里执行连接池定义。它应该在main()方法本身中还是在ConnectionHandler类中?另一件事:关于什么意见 我建议使用现有的连接池解决方案(例如C3PO)。或者使用应用服务器的内置数据库池(所有数据库池都提供此功能)。我建议使用现有的连接池解决方案(例如C3PO)。或者使用应用服务器的内置db池(所有这些池都提供了这样的功能)。池本身不应该位于Connectio
main()
方法本身中还是在ConnectionHandler
类中?另一件事:关于什么意见
我建议使用现有的连接池解决方案(例如C3PO)。或者使用应用服务器的内置数据库池(所有数据库池都提供此功能)。我建议使用现有的连接池解决方案(例如C3PO)。或者使用应用服务器的内置db池(所有这些池都提供了这样的功能)。池本身不应该位于
ConnectionHandler
中,因为一旦ConnectionHandler
完成运行,它就会丢失。然而,ConnectionHandler
必须具有对池的引用,以便能够实际获得数据库连接。因此,我建议将池存储在cServer
类中,在main()
中实例化它,并在生成ConnectionHandler
时为每个ConnectionHandler
提供对它的引用
我使用过C3P0和DBCP,但到目前为止从未听说过Bone CP。看起来很有希望,但我只能说这些了。这里比较的是C3P0和DBCP。池本身不应该位于
ConnectionHandler
中,因为一旦ConnectionHandler
完成运行,它就会丢失。然而,ConnectionHandler
必须具有对池的引用,以便能够实际获得数据库连接。因此,我建议将池存储在cServer
类中,在main()
中实例化它,并在生成ConnectionHandler
时为每个ConnectionHandler
提供对它的引用
我使用过C3P0和DBCP,但到目前为止从未听说过Bone CP。看起来很有希望,但我只能说这些了。这里比较C3P0和DBCP。如果您在JavaEE容器中部署,请通过JNDI使用该容器的连接池
如果您不是在Java EE容器中部署,请使用库,如或。如果您是在Java EE容器中部署,请通过JNDI使用该容器的连接池
如果您不是在Java EE容器中部署,请使用诸如或之类的库。您根本不必自己“定义连接池”。DBMS供应商会这样做。这绝对是错误的做法。@duffymo我知道我想使用BoneCp,但在哪里定义池?你根本不必自己“定义连接池”。DBMS供应商就是这么做的。这绝对是错误的做法。@duffymo我知道我想使用BoneCp,但池的定义在哪里?+1表示不重新发明现有的、经过测试的、经验证的技术。哦,你有充分的理由自己来做这件事吗?@evgeny有没有关于如何做这件事的例子?是的,我计划使用Bone-Cp。我们使用的是mysql,那么mysql有内置池吗?不管你使用什么数据库。只需使用谷歌搜索“C3PO教程”或“Tomcat连接池”等,具体取决于您使用的环境。您将找到配置文件等的示例。您还可以使用Hibernate或EJB持久性,而不是使用原始JDBC(我想,只要您要编写自己的连接池,情况就是这样).@我不打算写我自己的池我想使用现有的池Bone Cp只是我想知道在哪里配置它及其相关信息。+1不重新发明现有的、经过测试的、经验证的技术。哦,你有充分的理由自己来做这件事吗?@evgeny有没有关于如何做这件事的例子?是的,我计划使用Bone-Cp。我们使用的是mysql,那么mysql有内置池吗?不管你使用什么数据库。只需使用谷歌搜索“C3PO教程”或“Tomcat连接池”等,具体取决于您使用的环境。您将找到配置文件等的示例。您还可以使用Hibernate或EJB持久性,而不是使用原始JDBC(我想,只要您要编写自己的连接池,情况就是这样).@我不打算写我自己的池我想使用现有的一个,骨骼Cp只是我想知道在哪里配置它和它的相关信息。因为你对这个池有经验,通常当池完成后会发生什么,会建立新的连接,或者他们必须等待现有的连接释放。使用连接池方法时,我们需要注意的任何主要问题。c3p0总是创建新连接,并且您可以控制旧连接过期的速率()。DBCP确实允许您设置最大池大小,但您可以通过将其设置为-1()来删除最大池大小。至于其他主要问题,我想说也许应该避免c3p0,因为它已经存在多年了,现在仍然是版本0.9。DBCP是非常积极地维护的。顺便说一下,“总是创建新的连接”,我的意思是C3P0总是在所有当前连接都在使用时创建新的连接,我想这就是您所问的情况。如果有可用的连接,则不会创建新连接。DBCP也是如此。因此,池化设置(通常您猜测使用100左右)是否太高?它确实取决于您的应用程序:用户数量、底层DBMS的连接容量、,等。我总是发现,你必须进行实验,以获得最佳大小。因为你对这个池有经验,通常情况下,一旦池全部完成,将建立新的连接,或者他们必须等待现有的连接被释放。使用连接池方法时需要注意的任何主要问题。c3p0
public class cServer
{
class ConnectionHandler implements Runnable {
ConnectionHandler(Socket receivedSocketConn1) {
this.receivedSocketConn1=receivedSocketConn1;
}
public void run(){
createConnection();
processData();
closeConnection();
}
}
public void main()
{
try
{
final ServerSocket serverSocketConn = new ServerSocket(8000);
while (true){
try{
Socket socketConn1 = serverSocketConn.accept();
new Thread(new ConnectionHandler(socketConn1)).start();
}
catch(Exception e){
e.printStackTrace(System.out);
}
}
}
catch (Exception e){
e.printStackTrace(System.out);
}
}
}