0

在阅读了一些 servlet 架构、tomcat 机制和数据库池之后,我想知道我是否真的应该在我的 servlet 的 init 中打开一个连接(并在销毁时关闭)?我的目标是实现高性能,所以我想我应该使用连接池。一开始我使用tomcat的内置数据库池机制。

上下文.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() 并信任池机制?什么,如果我两个都用?

4

1 回答 1

2

如果你在 Init 中打开一个连接并在 Destroy 中关闭它,你几乎肯定会遇到问题。

Servlet 是多线程的。您只有一个处理多个线程的 servlet 实例。

例如,假设您插入一条记录,然后检索 last_insert_id()。如果您只运行一个线程,它将正常工作。如果您有两个或更多线程正在运行,那么您的一些线程将获得错误的引用。

到目前为止,最好的方法是根据请求从池中获取连接,并在完成后在 finally 块中释放它。

于 2012-06-04T12:28:06.133 回答