【问题标题】:enterprise with jdbc使用 JDBC 的企业
【发布时间】:2010-01-04 09:24:05
【问题描述】:

我有企业项目,但所有查询都是使用 oracle 存储过程实现的,我使用 jbdc 和 Spring 框架得到这样的结果:

 public class HoaDonDAOimpl extends JdbcDaoSupport implements HoaDonDAO {

 public List<HoaDon> getDsTatcaHoadonPhathanh(int vthang, int vnam,
   String vmaDvqltb) throws Exception {

  CallableStatement cs = getDataSource().getConnection().prepareCall(
    "{call PKG_QLNO.GetDsTatcaHoadonPhathanh(?,?,?,?)}");
  cs.setInt(1, vthang);
  cs.setInt(2, vnam);
  cs.setString(3, vmaDvqltb);
  cs.registerOutParameter(4, OracleTypes.CURSOR);
  cs.execute();
  ResultSet rs = (ResultSet) cs.getObject(4);

  List<HoaDon> list = new ArrayList<HoaDon>();

  while (rs.next()) {

   HoaDon hoadon = new HoaDon();

   hoadon.setChon(rs.getString("chon"));
   hoadon.setMa_so(rs.getString("ma_so"));
   hoadon.setMa_kh(rs.getString("ma_kh"));
   hoadon.setNam(rs.getString("nam"));
   hoadon.setThang(rs.getString("thang"));
   hoadon.setTien_PS(rs.getString("tien_PS"));
   hoadon.setThue_ps(rs.getString("thue_ps"));
   hoadon.setTien_khmai(rs.getString("tien_khmai"));
   hoadon.setTien_tbi(rs.getString("tien_tbi"));
   hoadon.setTong_ps(rs.getString("tong_ps"));
   hoadon.setTenkh(rs.getString("tenkh"));
   hoadon.setMa_dvqltb(rs.getString("ma_dvqltb"));
   hoadon.setSo_hd_in(rs.getString("so_hd_in"));
   hoadon.setNgay_in(rs.getString("ngay_in"));
   hoadon.setMa_httt(rs.getString("ma_pttt"));
   hoadon.setMa_httt(rs.getString("ma_httt"));
   hoadon.setDchi_khang(rs.getString("dchi_khang"));
   hoadon.setLoaitb(rs.getString("loaitb"));
   hoadon.setKh_hd(rs.getString("kh_hd"));
   hoadon.setLoai_hoadon(rs.getString("loai_hoadon"));
   hoadon.setLoaihd(rs.getString("loaihd"));
   hoadon.setKieu_in(rs.getString("kieu_in"));

   list.add(hoadon);
  }

  return list;
 }

但是,问题是,我提交或刷新以再次获取数据大约 4 到 5 次,我的程序没有运行。所以,我该怎么办,请给我一些解决方案,谢谢。

【问题讨论】:

  • 如果抛出异常,您能否添加一些控制台输出或跟踪跟踪?
  • 我的项目没有任何异常。
  • “不运行”到底是什么意思?
  • 第一次和第二次,当我运行我的项目时,它运行正常,但下一次,它让我永远等待,没有任何反应。

标签: java oracle spring jdbc


【解决方案1】:

我认为您需要使用调试器进入那里以找出程序挂起的位置。它可能是 cs.Execute 或 cs.GetObject,但您必须弄清楚在哪里。一旦您知道您将能够更好地确定到底发生了什么,但从我在这里看到的情况来看,没有办法提供更好的建议。

祝你好运。

【讨论】:

    【解决方案2】:

    如果一直卡住,可能是存储过程有问题...你应该尝试执行存储过程的每个部分,看看哪个部分挂了...

    【讨论】:

      【解决方案3】:

      getDataSource().getConnection() 返回的Connection 永远不会关闭。如果getDataSource() 返回的DataSource 正在池化数据库连接,这可能会导致问题。这是因为池通常具有可以同时打开的最大连接数。如果当前打开了最大数量的连接,getDataSource() 将等待其中一个“关闭”,然后将其释放回池中。因为你从来没有在你的Connection 上调用close(),所以它永远不会被释放回池中。

      您可能想尝试这样做,以确保您的连接在使用完后始终关闭:

      public List<HoaDon> getDsTatcaHoadonPhathanh(int vthang, int vnam, String vmaDvqltb) throws Exception {
          Connection con = getDataSource().getConnection();
          try {
              CallableStatement cs = con.prepareCall("{call PKG_QLNO.GetDsTatcaHoadonPhathanh(?,?,?,?)}");
      
              cs.setInt(1, vthang);
              cs.setInt(2, vnam);
              cs.setString(3, vmaDvqltb);
              cs.registerOutParameter(4, OracleTypes.CURSOR);
              cs.execute();
      
              ResultSet rs = (ResultSet) cs.getObject(4);
              List<HoaDon> list = new ArrayList<HoaDon>();
      
              while (rs.next()) {
      
                  HoaDon hoadon = new HoaDon();
      
                  hoadon.setChon(rs.getString("chon"));
                  hoadon.setMa_so(rs.getString("ma_so"));
                  hoadon.setMa_kh(rs.getString("ma_kh"));
                  hoadon.setNam(rs.getString("nam"));
                  hoadon.setThang(rs.getString("thang"));
                  hoadon.setTien_PS(rs.getString("tien_PS"));
                  hoadon.setThue_ps(rs.getString("thue_ps"));
                  hoadon.setTien_khmai(rs.getString("tien_khmai"));
                  hoadon.setTien_tbi(rs.getString("tien_tbi"));
                  hoadon.setTong_ps(rs.getString("tong_ps"));
                  hoadon.setTenkh(rs.getString("tenkh"));
                  hoadon.setMa_dvqltb(rs.getString("ma_dvqltb"));
                  hoadon.setSo_hd_in(rs.getString("so_hd_in"));
                  hoadon.setNgay_in(rs.getString("ngay_in"));
                  hoadon.setMa_httt(rs.getString("ma_pttt"));
                  hoadon.setMa_httt(rs.getString("ma_httt"));
                  hoadon.setDchi_khang(rs.getString("dchi_khang"));
                  hoadon.setLoaitb(rs.getString("loaitb"));
                  hoadon.setKh_hd(rs.getString("kh_hd"));
                  hoadon.setLoai_hoadon(rs.getString("loai_hoadon"));
                  hoadon.setLoaihd(rs.getString("loaihd"));
                  hoadon.setKieu_in(rs.getString("kieu_in"));
      
                  list.add(hoadon);
              }
      
              return list;
          } finally {
              con.close();
          }
      }
      

      同样,一些池化Connection 对象不符合Sun's documentation regarding close()

      释放此 Connection 对象的 数据库和 JDBC 资源 立即而不是等待 它们会自动释放

      如果您仍然遇到奇怪的问题,您可能必须自己明确关闭 csrs

      public List<HoaDon> getDsTatcaHoadonPhathanh(int vthang, int vnam, String vmaDvqltb) throws Exception {
          List<HoaDon> list = new ArrayList<HoaDon>();
      
          Connection con = getDataSource().getConnection();
          try {
              CallableStatement cs = con.prepareCall("{call PKG_QLNO.GetDsTatcaHoadonPhathanh(?,?,?,?)}");
      
              try {
                  cs.setInt(1, vthang);
                  cs.setInt(2, vnam);
                  cs.setString(3, vmaDvqltb);
                  cs.registerOutParameter(4, OracleTypes.CURSOR);
                  cs.execute();
      
                  ResultSet rs = (ResultSet) cs.getObject(4);
                  try {
                      while (rs.next()) {
      
                          HoaDon hoadon = new HoaDon();
      
                          hoadon.setChon(rs.getString("chon"));
                          hoadon.setMa_so(rs.getString("ma_so"));
                          hoadon.setMa_kh(rs.getString("ma_kh"));
                          hoadon.setNam(rs.getString("nam"));
                          hoadon.setThang(rs.getString("thang"));
                          hoadon.setTien_PS(rs.getString("tien_PS"));
                          hoadon.setThue_ps(rs.getString("thue_ps"));
                          hoadon.setTien_khmai(rs.getString("tien_khmai"));
                          hoadon.setTien_tbi(rs.getString("tien_tbi"));
                          hoadon.setTong_ps(rs.getString("tong_ps"));
                          hoadon.setTenkh(rs.getString("tenkh"));
                          hoadon.setMa_dvqltb(rs.getString("ma_dvqltb"));
                          hoadon.setSo_hd_in(rs.getString("so_hd_in"));
                          hoadon.setNgay_in(rs.getString("ngay_in"));
                          hoadon.setMa_httt(rs.getString("ma_pttt"));
                          hoadon.setMa_httt(rs.getString("ma_httt"));
                          hoadon.setDchi_khang(rs.getString("dchi_khang"));
                          hoadon.setLoaitb(rs.getString("loaitb"));
                          hoadon.setKh_hd(rs.getString("kh_hd"));
                          hoadon.setLoai_hoadon(rs.getString("loai_hoadon"));
                          hoadon.setLoaihd(rs.getString("loaihd"));
                          hoadon.setKieu_in(rs.getString("kieu_in"));
      
                          list.add(hoadon);
                      }
                  } finally {
                      rs.close();
                  }
              } finally {
                  cs.close();
              }
          } finally {
              con.close();
          }
      
          return list;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多