我是Java和Derby的新手。我在Tomcat 7上使用我的Flex应用程序。
当我从Flex调用Java时,登录函数工作正常,但我的getUserByUsername函数没有。
public Boolean loginUser(String username, String password) throws Exception
{
Connection c = null;
String hashedPassword = new String();
try
{
c = ConnectionHelper.getConnection();
PreparedStatement ps = c.prepareStatement("SELECT password FROM users WHERE username=?");
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if(rs.next())
{
hashedPassword = rs.getString("password");
}
else
{
return false;
}
if(Password.check(password, hashedPassword))
{
return true;
}
else
{
return false;
}
}
catch (SQLException e)
{
e.printStackTrace();throw new DAOException(e);
}
finally
{
ConnectionHelper.closeConnection(c);
}
}
public User getUserByUsername(String username) throws DAOException
{
//System.out.println("Executing DAO.getUserByName:" + username);
User user = new User();
Connection c = null;
try
{
c = ConnectionHelper.getConnection();
PreparedStatement ps = c.prepareStatement("SELECT * FROM users WHERE username = ?");
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
while(rs.next())
{
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setTeam(rs.getString("team"));
user.setScore(rs.getInt("score"));
}
}
catch (SQLException e)
{
e.printStackTrace();
throw new DAOException(e);
}
finally
{
ConnectionHelper.closeConnection(c);
}
return user;
}
我在Flex中得到的堆栈是无用的,据我所知:
Flex Message (Flex .messaging.messages. errormessage) clientId = 8EB6D37B-7E0B-01B0->AA55-457722B9036C correlationId = A39E574F-CFC6-51FE-6CBE-451AF329E2F8 destination>= service messageId = 8EB6DF4C-650B-BDD7-7802-B813A61C8DC8 timestamp =>1401318734645 timeolive = 0 body = null code = Server。处理消息=>服务。DAOException: java.sql.SQLException: Failed to start database>'/Applications/blazeds/tomcat/webapps/testdrive/WEB-INF/database/game_db',详情见下一个>异常。rootCause = ASObject(23393258)>>{message=java.sql. sql. detail = nullSQLException: Failed to start database>'/Applications/blazeds/tomcat/webapps/testdrive/WEB-INF/database/game_db',详情见下一个>异常。, suppressed=[], localizedMessage=java.sql。SQLException: Failed to>start database '/Applications/blazeds/tomcat/webapps/testdrive/WEB->INF/database/game_db',详情见下一个异常。,因为= java.sql。SQLException}>body = null extendedData = null
我的第一个想法是,这只是一个错误在我的函数(也许有人会注意到它),但我已经通过它看了几个小时,我看不到任何东西。
之后,我想也许Derby在并发连接方面有问题。我在某个地方看到嵌入式JDBC只能处理一个连接,所以我将驱动程序从嵌入式更改为客户端,这再次导致登录功能工作,另一个错误说连接中的url为空。任何想法吗?谢谢你的建议。
编辑:package services;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.net.URLDecoder;
public class ConnectionHelper
{
private String url;
private static ConnectionHelper instance;
public String getUrl()
{
return url;
}
private ConnectionHelper()
{
try
{
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
String str = URLDecoder.decode(getClass().getClassLoader().getResource("services").toString(),"UTF-8");
str= str.substring(0, str.indexOf("classes/services"));
if ( str.startsWith("file:/C:",0)){
str=str.substring(6);
}
else{
str=str.substring(5);
}
url = "jdbc:derby:" + str + "database/game_db";
System.out.println("Database url "+url);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static ConnectionHelper getInstance()
{
if (instance == null)
instance = new ConnectionHelper();
return instance;
}
public static Connection getConnection() throws java.sql.SQLException
{
return DriverManager.getConnection(getInstance().getUrl());
}
public static void closeConnection(Connection c)
{
try
{
if (c != null)
{
c.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
在嵌入式模式下使用多个连接没有问题。句号。
也就是说,您可能遇到的情况是,一次只有一个jvm进程可以访问Derby数据库文件。但是这个jvm可能有1000个线程,每个线程都有自己到Derby的连接(当然,资源允许)。