Dalam sistem berbilang benang, mempunyai satu tika statik java. sql.Objek sambungan boleh membawa kepada pelbagai isu. Pendekatan ini memperkenalkan kedua-dua keselamatan rangkaian dan kebimbangan pengurusan sumber.
Berbilang rangkaian yang mengakses sambungan dikongsi boleh mengakibatkan tingkah laku yang tidak dapat diramalkan. Pertimbangkan senario di mana beberapa utas secara serentak melaksanakan pertanyaan:
public static ResultSet searchUser(String user, String pass) { Connection conn = ConnectionPool.getConnection(); Statement stmt = conn.createStatement(); return stmt.executeQuery("SELECT * FROM users WHERE username='" + user + "' AND password='" + pass + "'"); }
Jika utas A berada di tengah-tengah melaksanakan pertanyaan dan utas B memulakan pertanyaan baharu, pertanyaan kedua boleh mengubah suai pangkalan data sebelum pertanyaan pertama lengkap. Ini boleh membawa kepada ketidakkonsistenan data dan hasil yang tidak dapat diramalkan.
Mengekalkan sambungan statik sepanjang hayat aplikasi menimbulkan isu pengurusan sumber yang ketara. Walaupun satu sambungan mungkin mencukupi pada mulanya, apabila volum pengguna meningkat, sambungan terbuka akhirnya akan tamat masa atau mencapai had kumpulan sambungannya. Ini boleh mengakibatkan aplikasi gagal mewujudkan sambungan baharu dan akhirnya menghentikan operasinya.
Untuk memastikan keselamatan benang dan pengurusan sumber yang cekap, adalah penting untuk memperoleh dan mengeluarkan pangkalan data sambungan dalam skop sesingkat mungkin, biasanya dalam blok cuba-dengan-sumber yang sama:
public User find(String username, String password) { User user = null; try ( Connection conn = dataSource.getConnection(); PreparedStatement statement = conn.prepareStatement("SELECT id, username, email FROM user WHERE username=? AND password=md5(?)"); ) { statement.setString(1, username); statement.setString(2, password); try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { user = new User(); user.setId(resultSet.getLong("id")); user.setUsername(resultSet.getString("username")); user.setEmail(resultSet.getString("email")); } } } return user; }
Dengan menutup sumber dengan segera, kami memastikan bahawa urutan tidak mengganggu antara satu sama lain dan sumber dikeluarkan dengan segera, mengelakkan kebocoran.
Jika prestasi penyambungan masih menjadi kebimbangan, pertimbangkan untuk melaksanakan pengumpulan sambungan. Pengumpulan sambungan mengekalkan himpunan sambungan yang telah ditetapkan yang boleh dikongsi antara berbilang rangkaian. Ini boleh meningkatkan prestasi dengan ketara dan mengurus sumber dengan lebih cekap.
Atas ialah kandungan terperinci Adakah Selamat Menggunakan java.sql.Connection Statik dalam Persekitaran Berbilang Thread?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!