Java Connect数据源永不终止

Java Connect数据源永不终止,java,unit-testing,datasource,glassfish-3,junit4,Java,Unit Testing,Datasource,Glassfish 3,Junit4,我正在写一个JUnit测试,试图测试与SqlServer数据库的连接,我知道,我知道。。。我不应该对数据库进行单元测试。问题是,我已经在glassfish中设置了数据源,事实上,ping测试成功了。但是当我尝试这个: 注意:配置为:从本地Glassfish进行单元测试,ping OK,远程数据库 @Test public void simpleConnect() { try { Context ctx = new InitialContext(); Da

我正在写一个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);
    }

}

没有任何事情发生,测试永远不会结束,没有正常或失败。我不知道我是否真的得到了连接。

尝试关闭连接

finally{ con.close; }

通常,在数据源上进行Junit测试是不可能的,它真的需要吗?

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

要连接到远程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实例查找数据源的方法,我会使用或类似的方法创建一个数据源,以便在Glassfish关闭时测试工作。

最初的想法是试着测试与数据源的连接,我尝试了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时,这将检索调用存储过程的结果集。显然,您可以用一个简单的查询select*from表来替换调用


如果您需要有关如何创建、连接和配置数据源的信息,请查看以下链接:

+1因为我知道,我不应该这样做:-从不在以下行中找到数据源:datasource datasource=datasource ctx.lookupMyDataSource,围绕该行循环,只会出现一个INFO:com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO:找不到javadb客户端jar文件,默认情况下derby jdbc驱动程序将不可用。必须有一些代码将MyDataSource放入上下文中。请编辑您的问题并向我们展示它是什么样子的。您为什么要使用ctx.lookup?为什么不在单元测试中创建一个数据源呢?事实上,我没有使用其他任何东西,我找到了一个解决方法,用jsp测试数据源。目前还不是最佳方案,但足以解决连接测试问题。我会出版它,也许有人会需要它;如果没有人将对象放入上下文中,您将得到一个NamingException。在initialContext之后,我添加了连接代码,但是,正在执行相同的操作。