【问题标题】:DAO-object gets from DB only limited count of objectsDAO 对象从数据库中获取的对象数量有限
【发布时间】:2014-01-02 14:24:59
【问题描述】:

DAO-object 从 DB 获取的对象数量有限。 只有清除 - 构建 - 部署才能提供帮助。

我有通过外键实体连接的数据库。其中之一是用户。另一个 - 书。 这些实体存储在表用户和库中。 在表用户中存储 100 行。 在表库中存储 1050 行。

用户实体类。

public class User {

private long id;
private String firstName;
private String lastName;
private String email;
private String login;
private String password;
private Gender gender;
private boolean confirmed;
private boolean banned;
private String registrationDate;
private boolean notify;
private Role role;

@Override
public String toString(){
    return id + " " + firstName + " " + lastName + " " + email + " " + login + " " + password + " " + gender
            + " " + confirmed + " " + banned + " " + registrationDate + " " + notify + " " + role;
}

public List<String> toStringList(){
    List<String> result = new ArrayList<String>();
    result.add(String.valueOf(id));
    result.add(firstName);
    result.add(lastName);
    result.add(email);
    result.add(login);
    result.add(password);
    result.add(String.valueOf(gender.toInt()));
    result.add(confirmed?"1":"0");
    result.add(banned?"1":"0");
    result.add(registrationDate);
    result.add(notify?"1":"0");
    result.add(String.valueOf(role.getId()));

    return result;
}

public User() {
}

public User(long id) {
    this.id = id;
}

public boolean isBanned() {
    return banned;
}

public void setBanned(boolean banned) {
    this.banned = banned;
}

public boolean isConfirmed() {
    return confirmed;
}

public void setConfirmed(boolean confirmed) {
    this.confirmed = confirmed;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public Gender getGender() {
    return gender;
}

public void setGender(Gender gender) {
    this.gender = gender;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public boolean isNotify() {
    return notify;
}

public void setNotify(boolean notify) {
    this.notify = notify;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getRegistrationDate() {
    return registrationDate;
}

public void setRegistrationDate(String registrationDate) {
    this.registrationDate = registrationDate.substring(0, 10);
}

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

}

带有 CRUD 方法的 UserDao 类。

    public class UserDao {

private Connection connection;

public UserDao() {
    connection = ConnectionProvider.getConnection();
}

public boolean createUser(User user) {
    try {
            String sqlRequest =
                    "INSERT INTO Users (ID,FIRST_NAME,LAST_NAME,EMAIL,LOGIN,PASSWORD," +
                    "GENDER,CONFIRMED,BANNED,REGISTRATION_DATE,NOTIFY,ROLE) " +
                    "values(?,'?','?','?','?','?',?, ?, ?, TO_DATE('?','yyyy-mm-dd'), ?, ?)";
        PreparedStatement ps = connection.prepareStatement(sqlRequest);

        ps.setLong(1, user.getId());
        ps.setString(2, user.getFirstName());
        ps.setString(3, user.getLastName());
        ps.setString(4, user.getEmail());
        ps.setString(5, user.getLogin());
        ps.setString(6, user.getPassword());
        ps.setInt(7, user.getGender().toInt());
        ps.setBoolean(8, user.isConfirmed());
        ps.setBoolean(9, user.isBanned());
        ps.setString(10, user.getRegistrationDate());
        ps.setBoolean(11, user.isNotify());
        ps.setInt(12, user.getRole().getId());
        ps.executeUpdate();

        connection.commit();

    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

public User getUserById(long id) {
    User user = new User();
    try {
            String sqlRequest =
                    "SELECT * FROM Users WHERE id=?";
        PreparedStatement ps = connection.prepareStatement(sqlRequest);

        ps.setLong(1, id);
        ResultSet rs = ps.executeQuery();

        if (rs.next()) {
            user.setId(rs.getLong("id"));
            user.setFirstName(rs.getString("FIRST_NAME"));
            user.setLastName(rs.getString("LAST_NAME"));
            user.setEmail(rs.getString("EMAIL"));
            user.setLogin(rs.getString("LOGIN"));
            user.setPassword(rs.getString("PASSWORD"));
            user.setGender(Gender.getGender(rs.getInt("GENDER")));
            user.setConfirmed(rs.getInt("CONFIRMED")==1);
            user.setBanned(rs.getInt("BANNED")==1);
            //String[] regDate = rs.getString("REGISTRATION_DATE").split(".");
            //user.setRegistrationDate(Date.valueOf(regDate[2]+"-"+regDate[1]+"-"+regDate[0]));
            user.setRegistrationDate(rs.getString("REGISTRATION_DATE"));
            user.setNotify(rs.getInt("NOTIFY")==1);
            user.setRole(new RoleDao().getRoleById(rs.getInt("ROLE")));
            //user.setRole(new Role(1, "Administrator"));
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return user;
}

public List<User> getAllUsers() {
    List<User> users = new ArrayList<User>();
    try {
            String sqlRequest =
                    "SELECT * FROM Users";
        PreparedStatement ps = connection.prepareStatement(sqlRequest);

        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setFirstName(rs.getString("FIRST_NAME"));
            user.setLastName(rs.getString("LAST_NAME"));
            user.setEmail(rs.getString("EMAIL"));
            user.setLogin(rs.getString("LOGIN"));
            user.setPassword(rs.getString("PASSWORD"));
            user.setGender(Gender.getGender(rs.getInt("GENDER")));
            user.setConfirmed(rs.getInt("CONFIRMED")==1);
            user.setBanned(rs.getInt("BANNED")==1);
            user.setRegistrationDate(rs.getString("REGISTRATION_DATE"));
            user.setNotify(rs.getInt("NOTIFY")==1);
            user.setRole(new RoleDao().getRoleById(rs.getInt("ROLE")));
            users.add(user);
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return users;
}

public boolean removeUser(int id) {
    try {
            String sqlRequest = "DELETE FROM users WHERE id=?";
        PreparedStatement ps = connection.prepareStatement(sqlRequest);
        ps.setInt(1, id);
        ps.executeUpdate();
        connection.commit();

    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }
    return true;
  }

public boolean  editUser(User user) {
    try {
            String sqlRequest = "UPDATE Users SET FIRST_NAME='?', LAST_NAME='?', " +
                    "EMAIL='?', LOGIN='?', PASSWORD='?', GENDER=?, CONFIRMED=?, " +
                    "BANNED=?, REGISTRATION_DATE=TO_DATE('?','yyyy-mm-dd'), NOTIFY=?, ROLE=? WHERE ID=?";
        PreparedStatement ps = connection.prepareStatement(sqlRequest);

        String[] userParams = new String[12];
        userParams = user.toStringList().toArray(userParams);
        for(int i=1; i < 12; i++)
            ps.setString(i, userParams[i]);
        ps.setString(12, userParams[0]);

        ps.executeUpdate();
        connection.prepareStatement("commit").executeUpdate();
        connection.commit();

    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

}

实体类和库的DAO类似。

ConnectionProvider 类。像单例对象一样存储连接。

public class ConnectionProvider {

private static Connection con = null;

private ConnectionProvider(){}

public static Connection getConnection() {
    if (con != null)
        return con;
    else {
        try {
            Locale.setDefault(Locale.ENGLISH);
            Context ic = new InitialContext();
            DataSource dataSource = (DataSource) ic.lookup("jdbc/test");
            con = dataSource.getConnection();
        }
        catch(NamingException e)
        {
            System.out.println("Cannot retrieve jdbc/test"+e.getMessage());
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        return con;
    }

}

}

用于测试 Dao 的 JSP 页面正文。 当此代码有效时,您可以正确刷新页面 3 次。第四次你会得到空白页。

    <%
        List<User> users = new UserDao().getAllUsers();
        for(User u : users){
           out.println(u.toString()+"<br/>");
        }
 %>

当此代码有效时,您可以正确加载第 1 页(您将看到所有 1050 条记录)。刷新后你会得到空白页。

        <%
        List<Library> books = new LibraryDao().getAllBooks();
        for(TransferObject.Library b : books){
         out.println(b.toString()+"<br/>");
        }
    %>

如果有人知道,请说出我的代名词。这是一个非常奇怪的问题,我不明白为什么会这样。我可以看到来自 DB 的记录数量有限,然后方法 getAllUsers() 或 getAllBooks() 返回 null。

【问题讨论】:

  • 我会删除所有catch 语句或用一些throw MyException("Friendly message", e); 替换它们的块内容您是hiding the errors 并且必须检查您的日志以查看打印的堆栈跟踪。此外,隐藏错误可能会导致您的应用程序出现未定义的行为,因此您真的应该避免它!
  • 另外,你应该确保你是closing all resources。这意味着每次在方法中使用完PreparedStatementResultSetConnection 之后,它们都会关闭。如果您不关闭它们,您将在一段时间后耗尽资源。那可能是你的问题。
  • 编写一个简单的 JSP,您可以在其中多次检索所有用户/书籍的列表并尝试显示所有结果。还将e.printStackTrace()in getAllXXX()-methods 替换为throw new IllegalStateException("Error occurred!", e);。并在此处发布您的测试结果。
  • @Vlad Glassfish 写道:类型异常报告消息描述服务器遇到内部错误 () 阻止它完成此请求。异常 java.lang.IllegalStateException:发生错误! note 异常的完整堆栈跟踪及其根本原因可在 Sun GlassFish Enterprise Server v2.1.1 日志中找到。
  • 那么 glasfish 的日志文件是什么意思?异常的原因是什么?

标签: java oracle jsp jakarta-ee dao


【解决方案1】:

您应该在每次检索数据后关闭连接。为了节省资源,您可以使用连接池来共享连接。错误的原因是未重置的数据库游标。尝试在每次操作后关闭连接,并在每次新请求之前创建一个新连接。连接池可以稍后应用。

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2020-03-08
    • 2016-12-10
    • 2014-09-17
    • 2018-03-23
    相关资源
    最近更新 更多