【问题标题】:JDBC connection errorJDBC连接错误
【发布时间】:2015-06-12 13:21:10
【问题描述】:

我在 Glassfish 中创建了一个 JDBC 连接池并将其用作 JDBC 资源“jdbc/__default”。我可以在管理控制台界面中成功ping通这个连接池。

然后,我正在尝试运行以下程序:

package de.java2enterprise.onlineshop;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import javax.annotation.Resource;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // @Resource(name="jdbc/__default")
    // private DataSource ds;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter writer = response.getWriter();
        response.setContentType("text/html;charset=UTF-8");
        writer.println("<!DOCTYPE html>");
        writer.println("<html><body>");

        Connection con = null;
        DataSource ds;
        try {

            ds = (DataSource) InitialContext.doLookup("jdbc/__default");
            con = ds.getConnection();

            if (con.isValid(10)) {
                writer.println("<BR>Connected!");
            }
            con.close();

        } catch (Exception ex) {
            writer.println(ex.getMessage());
        } finally {
            if (con != null){
                try{
                    con.close();
                } catch (Exception ex){

                }
            }
        }
        writer.println("<BR>Test finished!</body></html>");
        writer.close();
    }
}

但是,我在网络浏览器中收到以下错误:

分配连接时出错。原因:无法分配连接,因为:侦听器拒绝连接并出现以下错误:ORA-12518,TNS:侦听器无法切换​​客户端连接 测试完毕!

在服务器日志中,我收到以下错误:

2015-04-08T08:15:20.540+0200|信息:在 [onlineshop-war] 加载应用程序 [onlineshop#onlineshop-war.war] 2015-04-08T08:15:20.636+0200|信息:网店在611毫秒内部署成功。 2015-04-08T08:15:38.552+0200|警告:来自 ServletContext 的上下文路径:/onlineshop-war 与来自 bundle 的路径不同:onlineshop-war 2015-04-08T08:15:38.802+0200|信息:访问未访问的引用 2015-04-08T08:15:39.519+0200|信息:成功获取INSTRUMENTATION:sun.instrument.InstrumentationImpl@2d618042

2015-04-08T08:15:41.471+0200|警告:RAR5038:为池在线商店创建资源时出现意外异常。异常:javax.resource.spi.ResourceAllocationException:无法分配连接,因为:侦听器拒绝连接并出现以下错误: ORA-12516, TNS:listener 找不到具有匹配协议栈的可用处理程序

2015-04-08T08:15:41.471+0200|警告:RAR5117:无法从连接池 [ Onlineshop ] 获取/创建连接。原因:com.sun.appserv.connectors.internal.api.PoolingException:无法分配连接,因为:侦听器拒绝连接并出现以下错误: ORA-12516, TNS:listener 找不到具有匹配协议栈的可用处理程序

2015-04-08T08:15:41.486+0200|警告:RAR5114:分配连接时出错:[分配连接时出错。原因:无法分配连接,因为:侦听器拒绝连接并出现以下错误: ORA-12516, TNS:listener 找不到具有匹配协议栈的可用处理程序 ]

之后,我无法再次 ping 连接池,并且在管理控制台中收到或多或少相同的错误。

我使用以下配置:JDK 1.8.0_25、GlassFish Server Open Source Edition 4.1(build 13)、Oracle Database XE 11.2

在 Glassfish 管理控制台中,我创建了以下 JDBC 资源:JNDI 名称:jdbc/__default,逻辑 JNDI 名称:java:comp/DefaultDataSource,连接池:Onlineshop。 JDBC 连接池名称为 Onlineshop,资源类型:javax.sql.DataSource,类名:oracle.jdbc.pool.OracleDataSource

我的最小池大小为 800 个连接,最大为 3200 个连接。其他参数我保持不变,我只在 JDBC 连接池属性中添加了用户和密码。

任何人的想法? :-)

【问题讨论】:

    标签: jdbc glassfish


    【解决方案1】:

    如果您使用 jdk7+,请在 finally blocktry-with-resources 中关闭您的连接,因为它应该在 Java 中完成。看看有没有帮助

    【讨论】:

    • 您好 jjd,谢谢!我已将以下内容添加到我的代码中,但这不起作用:finally { if (con != null){ try{ con.close(); writer.close(); } catch (Exception ex){ } } }
    • 能否请您用您所做的更改更新代码,并提供更多信息,例如您使用的数据库、驱动程序、连接池设置
    • 我在上面添加了信息。还缺少什么吗?
    • 愚蠢的问题:你的域 lib 文件夹中有 oracle 驱动程序,对吗?
    • 你可以通过官方文档docs.oracle.com/cd/E18930_01/html/821-2432/gkyan.html 来检查你的价值观。这个适用于 v3.1,但我相信它适用于当前版本。您可能还想使用文档中的命令重新创建您的池,看看它是否有帮助。您可能还需要仔细检查您使用的用户是否有权访问数据库
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多