tomcat 是否推荐在servlet的init()和destroy()中使用get/close DB连接?[副本]

yws3nbqq  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(132)

此问题已在此处有答案

How should I connect to JDBC database / datasource in a servlet based application?(2个答案)
Is it safe to use a static java.sql.Connection instance in a multithreaded system?(2个答案)
9天前关闭
在阅读了servlet体系结构、Tomcat机制和DB池之后,我想知道我是否真的应该在servlet的init中打开一个连接(并在destroy中关闭)?我的目标是获得高性能,所以我想我应该使用连接池。首先,我使用tomcat内置的DB池机制。
context.xml

<Context>
    <Resource name="jdbc/mytest" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="userxy" password="xy" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/mytest"/>
</Context>

网站xml:

<resource-ref>
    <description>MyTest</description>
    <res-ref-name>jdbc/mytest</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

我很确定我可以很容易地用s.th.代替它。如果必要的话。所以我的问题是我应该使用称为doGet()的每请求而不是serlet的init()/destroy()并信任池机制吗?如果我两个都用呢

ccrfmcuu

ccrfmcuu1#

如果你在Init中打开一个连接,然后在Destroy中关闭它,你几乎肯定会遇到问题。
Servlet是多线程的。只有一个servlet示例处理多个线程。
例如,假设您插入一条记录,然后检索last_insert_id()。如果你只有一个线程在运行,它会工作得很好。如果你有两个或更多的线程在运行,你的一些线程将得到错误的引用。
到目前为止,最好的方法是在请求时从池中获取连接,并在完成时在finally块中释放它。

相关问题