Java Connect数据源永不终止
我正在写一个JUnit测试,试图测试与SqlServer数据库的连接,我知道,我知道。。。我不应该对数据库进行单元测试。问题是,我已经在glassfish中设置了数据源,事实上,ping测试成功了。但是当我尝试这个: 注意:配置为:从本地Glassfish进行单元测试,ping OK,远程数据库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
@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之后,我添加了连接代码,但是,正在执行相同的操作。