为什么在新线程中创建sql连接?

时间:2014-10-06 17:08:18

标签: java multithreading

我对下面的课程有几个问题。

public class Test {
    public void run() throws SQLException {
        Connection conn = getConnection();
        DSLContext create = DSL.using(conn, SQLDialect.MYSQL);

        // query books for author named 'selena'
        Result<Record2<Long, String>> result = create
                .select(BOOK.ID, BOOK.TITLE).from(BOOK).join(BOOK_AUTHOR_REL)
                .on(BOOK_AUTHOR_REL.BOOKID.equal(BOOK.ID)).join(AUTHOR)
                .on(BOOK_AUTHOR_REL.AUTHORID.equal(AUTHOR.ID))
                .where(AUTHOR.NAME.equal("selena"))
                .orderBy(BOOK.TITLE.asc(), BOOK.ID.asc()).fetch();
        result.forEach((r) -> {
            System.out.println(String.format("%s (id: %s)",
                    r.getValue(BOOK.TITLE), r.getValue(BOOK.ID)));
        });
        conn.close();
        System.exit(0);
    }

    public static void main(final String[] args) throws SQLException {
        new Test().run();
    }

    private Connection getConnection() {
        try {
            Class.forName(System.getProperty("jdbc.driver")).newInstance();
            return DriverManager.getConnection(System.getProperty("jdbc.url"),
                    System.getProperty("jdbc.user"),
                    System.getProperty("jdbc.password"));
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  1. 为什么在新线程中创建新连接?为什么我们称之为void run而不是属于类实例的任何其他方法?
  2. 为什么字符串参数final在这里?

    public static void main(final String[] args) throws SQLException {
       new Test().run();
    }
    
  3. 关闭连接后,我们为什么要拨打System.exit()

        conn.close();
        System.exit(0);
    

2 个答案:

答案 0 :(得分:3)

这是错误的代码。不要使用它。

他们没有正确关闭资源。

无法按照书面形式汇集联系。

我将该Connection传递给构造函数并初始化私有数据成员,以便run()方法可以访问它。

我认为没有理由调用System.exit(0)。更糟糕的想法。

答案 1 :(得分:2)

它不是在新线程中创建的。为了在新线程中调用它,Test必须实现Runnable(或扩展Thread)。假设Test实现了Runnable,那么会有像new Thread(new Test()).start();这样的行。

有一种约定,即方法的参数不应该被修改。使用final可以防止这种情况,但这里没有必要,因为JVM在调用main之后不会对args做任何事情。另请注意,使数组最终不能使其内容不可修改。

这里不需要调用System.exit。无论如何,代码都已完成执行,一旦没有更多的代码运行,JVM将终止。 System.exit突然杀死了JVM。

这不是很棒的代码。让getConnection捕获异常并返回null是坏样式(因为程序的其余部分不知道连接是null并且将尝试访问它,导致NullPointerException),它可以更改为:

private Connection getConnection() throws SQLException {
    return DriverManager.getConnection(System.getProperty("jdbc.url"),
            System.getProperty("jdbc.user"),
            System.getProperty("jdbc.password"));
}
类型4 jdbc驱动程序不需要

Class.forName,并且调用newInstance不会做任何有用的事情。

如果抛出异常,连接也不会关闭,服务器端的连接将暂停。

这是用于演示DSL类的管道代码。我不会太担心它。