Nuestros programadores estrellas han agotado sus depósitos de café, investigando a tiempo completo por la resolución, hasta que Nora encontró la contestación en Gogs así que en este momento la comparte aquí.
Solución:
Mientras no devuelvas el mismoConnection
instancia en getConnection()
llama, entonces no hay nada de qué preocuparse. Cada persona que llame obtendrá su propia instancia. Hasta ahora, está creando una nueva conexión en cada getConnection()
llamar y por lo tanto no devolver algunos static o variable de instancia. Así que es seguro.
Sin embargo, este enfoque es torpe. No es necesario que sea un singleton. Una clase de ayuda/utilidad también está perfectamente bien. O si desea un poco más de abstracción, un administrador de conexión devuelto por una fábrica abstracta. Solo lo cambiaría para obtener la fuente de datos solo una vez durante la inicialización de la clase en lugar de cada vez en getConnection()
. Es la misma instancia cada vez de todos modos. Mantenlo barato. Aquí hay un ejemplo básico de lanzamiento:
public class Database
private static DataSource dataSource;
static
try
dataSource = new InitialContext().lookup("jndifordbconc");
catch (NamingException e)
throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI", e);
public static Connection getConnection()
return dataSource.getConnection();
que se utilizará de la siguiente manera según el idioma normal de JDBC.
public List list() throws SQLException
List entities = new ArrayList();
try (
Connection connection = Database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, foo, bar FROM entity");
ResultSet resultSet = statement.executeQuery();
)
while (resultSet.next())
Entity entity = new Entity();
entity.setId(resultSet.getLong("id"));
entity.setFoo(resultSet.getString("foo"));
entity.setBar(resultSet.getString("bar"));
entities.add(entity);
return entities;
Ver también:
- ¿Es seguro usar un static java.sql.Instancia de conexión en un sistema multiproceso?
El siguiente código es un Patrón Singleton probado y en funcionamiento para Java.
public class Database {
private static Database dbIsntance;
private static Connection con ;
private static Statement stmt;
private Database()
// private constructor //
public static Database getInstance()
if(dbIsntance==null)
dbIsntance= new Database();
return dbIsntance;
public Connection getConnection()
if(con==null)
try
String host = "jdbc:derby://localhost:1527/yourdatabasename";
String username = "yourusername";
String password = "yourpassword";
con = DriverManager.getConnection( host, username, password );
catch (SQLException ex)
Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
return con;
Mientras obtiene la conexión en cualquier clase, simplemente use la siguiente línea
Connection con = Database.getInstance().getConnection();
Espero que pueda ayudar 🙂
package es.sm2.conexion;
import java.sql.Connection;
import java.sql.DriverManager;
public class ConexionTest
private static Connection conn = null;
static Connection getConnection() throws Exception
if (conn == null)
String url = "jdbc:mysql://localhost:3306/";
String dbName = "test";
String driver = "com.mysql.jdbc.Driver";
String userName = "userparatest";
String password = "userparatest";
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url + dbName, userName, password);
return conn;
Para cerrar Conexión
public static void closeConnection(Connection conn)
try
conn.close();
catch (SQLException e)
Para llamar a la conexión:
package conexion.uno;
import java.sql.*;
import es.sm2.conexion.ConexionTest;
public class LLamadorConexion
public void llamada()
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultado = null;
String query = "SELECT * FROM empleados";
try
conn = ConexionTest.getConnection();
statement = conn.prepareStatement(query);
resultado = statement.executeQuery();
while (resultado.next())
System.out.println(resultado.getString(1) + "t" + resultado.getString(2) + "t" + resultado.getString(3) + "t" );
catch (Exception e)
System.err.println("El porque del cascar: " + e.getMessage());
finally
ConexionTest.closeConnection(conn);
Valoraciones y comentarios
No se te olvide difundir este escrito si te fue útil.