【发布时间】:2018-09-07 10:19:17
【问题描述】:
我正在将 activejdbc 用于我必须为学校做的 Java ee 项目,我真的很喜欢它。但是,当我需要在一个 HttpServletRequest 中与同一个数据库建立多个连接时,我确实会遇到一个反复出现的问题。
场景如下: 我有一个自定义标签,它列出了每个请求都会调用的用户购物车的内容,因为我将它放在我的 header.jsp 中。在这个标签中,我向 activeJdbc 询问该用户购物车的内容。它看起来像这样:
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/wpr_webshop", "root", "root");
Iterator<Record> rIter = shopCart.getAll(Record.class).iterator();
if (rIter.hasNext()) {
int shoppingCartTotal = 0;
out.write("<div class='shoppingcartcontents'>Your cart contains:<br>");
while (rIter.hasNext()) {
Record r = rIter.next();
Artist a = r.parent(Artist.class);
out.write(a.getString("artist_name") + " - " + r.getString("title") + "<br />");
shoppingCartTotal += r.getInteger("price");
}
Base.close();
然后,在一个 servlet 中呈现一个 jsp,该 jsp 包含使用上面的标签的 jsp,我用 activejdbc 做一些额外的事情,比如正常的记录选择;还在同一个数据库上使用Base.open(),这给了我一个
org.javalite.activejdbc.DBException: Cannot open a new connection because existing connection is still on current thread, name: default, connection instance: com.mysql.jdbc.JDBC4Connection@2c2552bd. This might indicate a logical error in your application.
异常。我知道这里的问题是什么,一旦我不再需要它,我已经非常彻底地关闭了基本连接,但我似乎无法阻止这个问题。
我想解决这个问题的方法是允许在每个请求上调用的自定义标记使用不同的连接,以免与基本连接发生冲突。不幸的是,我找不到任何有关如何在网络上打开与同一数据库的第二个连接的信息。
这甚至可能吗?还是我只是做错了?
【问题讨论】:
标签: jsp servlets jakarta-ee activejdbc