启动Derby数据库失败



我是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的连接(当然,资源允许)。

相关内容

最新更新