postgres 上的错误转换连接

Posted

技术标签:

【中文标题】postgres 上的错误转换连接【英文标题】:error cast connection on postgres 【发布时间】:2012-01-07 18:09:17 【问题描述】:

大家晚安,这是我的第一个问题。

我在使用 tomcat webserver 运行 ZK 应用程序时遇到了一些问题

java.lang.ClassCastException: org.postgresql.jdbc4.Jdbc4Connection 无法转换为 controller.connection controller.connection.(connection.java:27) controller.lap_keuangan.lk_Controller.preparelistlk(lk_Controller.java:34) controller.lap_keuangan.lk_Controller.doAfterCompose(lk_Controller.java:30)

这是我的连接类:

package controller;

//import ommited


public class connection 

  private static final String url="jdbc:postgresql://192.168.56.101:5432/adempiere";
  private static final String user = "postgres";
  private static final String pwd = "auliaardy";
  private connection conn;

  public connection()throws Exception
      try 
          DriverManager.registerDriver(new org.postgresql.Driver());
          conn =  (connection) DriverManager.getConnection(url,user,pwd);

       catch (SQLException e) 
          System.out.println("Driver tidak ditemukan"+e);
      
  

  public Connection getConnection()
      return (Connection) conn;
  

  public void closeConnection()
      try 
          conn.closeConnection();
       catch (Exception e) 
          System.out.println("gagal menutup koneksi disebabkan: "+e);
      
  

  

这是我的控制器类

//import ommited here

public class lk_Controller extends GenericForwardComposer 

    private Listbox listlk;

    @Override
    public void doAfterCompose(Component comp) throws Exception 
        super.doAfterCompose(comp);
        preparelistlk();
    

    public void preparelistlk() throws Exception 
        connection c = new connection();
        try 
            l_keuangan lk = new l_keuangan(c.getConnection());
            List<tbl_lk> llk = lk.getLKeuangan();
            ListModelList lml = new ListModelList(llk, true);
            listlk.setModel(lml);
            listlk.setItemRenderer(new ListitemRenderer() 

                @Override
                public void render(Listitem lslk, Object o) throws Exception 

                    try 

                        tbl_lk tl = (tbl_lk) o;
                        new Listcell(ubahtanggal()).setParent(lslk);
                        new Listcell(Integer.toString(tl.getSum_debit())).setParent(lslk);
                        new Listcell(Integer.toString(tl.getSum_credit())).setParent(lslk);
                        new Listcell(Integer.toString(tl.getTotal())).setParent(lslk);
                     catch (Exception e) 
                        e.printStackTrace();
                    
                
            );
         catch (Exception e) 
            e.printStackTrace();
        
    

    public  String ubahtanggal() 
        tbl_lk lk = new tbl_lk();
        DateFormat df = new SimpleDateFormat("YYYY/MM/DD");
        long tanggal = lk.getTanggal().getTime();
        String tgl = df.format(tanggal);
        return tgl;




    

tomcat 说行错误: DriverManager.registerDriver(new org.postgresql.Driver()); conn = (connection) DriverManager.getConnection(url,user,pwd);

我无法将投射连接更改为: conn = DriverManager.getConnection(url,user,pwd);

请大家帮忙,我被困了一夜T.T

【问题讨论】:

在Java中,类名/构造函数通常以大写字母开头,变量和方法以小写字母开头,通常不包含下划线 【参考方案1】:

DriverManager 对象返回java.sql.Connection 的实现。它不会返回您的 controller.connection 类的实例。你的conn 变量应该是java.sql.Connection 类型。

注意:

Java 中的类,按照惯例,总是以大写字母开头 将您的类命名为connection,并使其包装类Connection 的对象,这真的很令人困惑。如此混乱,以至于您被自己的代码弄糊涂了。

【讨论】:

【参考方案2】:

改变这个:

private connection conn;

到这里:

private Connection conn;

还有这个:

conn =  (connection) DriverManager.getConnection(url,user,pwd);

到这里:

conn =  DriverManager.getConnection(url,user,pwd);

JDBC 的"Connection" 类以大写字母开头并位于java.sql 包中(全限定类名称为java.sql.Connection)。您不小心使用了小写字母 connection,这是您写入的类的名称,java.sql.Connection 无法转换。

另外,在 Java 中,约定是使用 CamelCase 作为类名,并且类名不应以小写开头,因此最好将类重命名为 ConnectionUtilConnectionManager

//
// NOTE: must be in ConnectionManager.java
//
package controller;

// imports ommited


public class ConnectionManager 

  private static final String url="jdbc:postgresql://192.168.56.101:5432/adempiere";
  private static final String user = "postgres";
  private static final String pwd = "auliaardy";
  private Connection conn;

  public Connection() throws Exception
      try 
          DriverManager.registerDriver(new org.postgresql.Driver());
          conn =  (Connection) DriverManager.getConnection(url,user,pwd);

       catch (SQLException e) 
          System.out.println("Driver tidak ditemukan"+e);
      
  

  public Connection getConnection() 
      return conn;
  

  public void closeConnection() 
      try 
          conn.closeConnection();
       catch (Exception e) 
          System.out.println("gagal menutup koneksi disebabkan: "+e);
      
  


同样,您应该将lk_Controller 重命名为LKController。除非在 ZK 中,约定有些不同。

【讨论】:

我猜你的意思是“到这个:conn = DriverManager.getConnection(url,user,pwd);” 您的第二次更改在两条线上都是相同的。我想你的意思是 conn = (Connection) DriverManager.getConnection(url,user,pwd); 天哪,我忘记了我的班级名称和变量,谢谢先生它的作品:D @aulia 不客气!顺便说一句,我希望那不是您的通用密码! :) @Behrang Saeedzadeh 老实说,这不是我的密码先生:D

以上是关于postgres 上的错误转换连接的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库

Bd Postgres 与 Laravel 的连接?

在主机上的客户端 docker 和 postgres 服务器之间连接 [重复]

Postgres - 删除连接,使用给出错误

golang postgres连接太多错误

将 T-SQL 查询转换为 Postgres