【问题标题】:Java Connect Datasource never endsJava Connect 数据源永无止境
【发布时间】:2013-02-04 14:07:48
【问题描述】:

我正在编写一个 JUnit 测试,试图测试与 SqlServer 数据库的连接(我知道,我知道......我不应该对数据库进行单元测试)。问题是,我已经在 glassfish 中设置了数据源,实际上,ping 测试“成功”了。但是!,当我尝试这个时:

注意:配置是:本地 Glassfish 的单元测试(ping OK),远程数据库

@Test
public void simpleConnect() {

    try {
        Context ctx = new InitialContext();
        DataSource dataSource = (DataSource) ctx.lookup("MyDataSource");
        Connection con = dataSource.getConnection();
        assertTrue(con != null && dataSource != null);
    }
    catch (NamingException ex) {
        fail("Cannot get connection: " + ex);
    }
    catch (SQLException ex) {
        fail("Cannot get connection: " + ex);
    }

}

什么都没有发生,测试永远不会结束,NO 抛出 Ok 或 Fail。我不知道我是否真的得到了联系。

【问题讨论】:

  • +1 表示“我知道,我不应该这样做”。 :-)

标签: java unit-testing datasource glassfish-3 junit4


【解决方案1】:

尝试关闭连接。

finally{ con.close; }

通常不会对数据源进行 Junit 测试,真的需要吗?

【讨论】:

    【解决方案2】:

    测试中没有任何明显导致它挂起的东西。我建议在调试器中运行它以隔离它挂起的行。

    【讨论】:

    • 从未在以下行中找到数据源:DataSource dataSource = (DataSource) ctx.lookup("MyDataSource"); ,围绕该行循环,只出现一个INFO:“com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO:找不到javadb客户端jar文件,默认情况下derby jdbc驱动程序将不可用。”
    • 一定有一些代码将MyDataSource 放入Context。请编辑您的问题并向我们展示它的外观。
    • 你为什么要使用ctx.lookup()?为什么不在单元测试中创建数据源?
    • 其实我没有用别的,我找到了一个变通方法,用jsp测试数据源。目前不是最佳的,但足以解决连接测试。我会发布它,也许有人会需要它。
    • 这不可能;如果没有人将对象放在上下文中,你会得到一个NamingException
    【解决方案3】:

    要连接到远程 Glassfish 服务器的 JNDI 上下文,需要将属性传递给 InitialContext 构造函数:

    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
    props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
    props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    InitialContext ctx = new InitialContext(props);
    

    您可以将其称为集成测试而不是单元测试,这并没有触犯法律!

    我个人不会在集成测试中使用这种从远程 Glassfish 实例中查找数据源的方法,我会使用 Commons DBCP 或类似方法创建一个数据源,以便在 GlassFish 关闭时进行测试。

    【讨论】:

    • 在initialContext之后,我添加了连接代码,但是,是一样的。
    【解决方案4】:

    这个想法最初是尝试测试与数据源的连接,我正在尝试 JUnit,但在我的情况下不起作用,所以,我找到了使用 JSP 页面的解决方案。

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.PreparedStatement"%>
    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.Connection"%>
    <%@page import="javax.sql.DataSource"%>
    <%@page import="javax.naming.InitialContext"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                       "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Test DataSource Connection</title>
      </head>
    <body>
    <h1>Connecting to Pooled Database</h1>  
    <%
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("MyDataSource");
        Connection connection = ds.getConnection();
    
        if (connection == null) {
            throw new SQLException("Error establishing connection!");
        }
    
        PreparedStatement stmt = null;
        ResultSet result = null;
        stmt = connection.prepareStatement("{call StoredProcedure(?,?)}");
        stmt.setString(1, "1");
        stmt.setString(2, "2");
        result = stmt.executeQuery();
    
        while (result.next()) {
            out.print(result.getString(1) + "<br>");
        }
    %>
    
    <h2>DataSource Working!</h2>
    </body>
    </html>
    

    当您运行 JSP 时,这将检索对存储过程的调用的结果集。显然你可以用一个简单的查询替换调用(从表中选择 *)

    如果您可能需要有关如何创建、连接和配置数据源的信息,请查看此链接:http://netbeans.dzone.com/connection-pooling-glassfish-nb

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2012-12-04
      • 2020-06-25
      相关资源
      最近更新 更多