我有一个名为ConnectionDerby的类,在该类中,我设置了连接到嵌入式数据库(Derby)的参数,我想减少连接的冗余度,实际的方法和连接可以工作,但我想提高性能,因此该类的代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
public class ConnectionDerby {
private Connection conn = null;
private Statement sttm = null;
public Connection CrearBD(String query) {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\\BD\\inventario.db;create=true");
if (conn != null) {
//JOptionPane.showMessageDialog(null, "Base de Datos Lista");
try {
PreparedStatement pstm = conn.prepareStatement(query);
pstm.execute();
pstm.close();
//JOptionPane.showMessageDialog(null, "Base de Datos Creada Correctamente");
System.out.println("SENTENCIA SQL EFECTUADA CORRECTAMENTE");
} catch (SQLException ex) {
//JOptionPane.showMessageDialog(null, ex.getLocalizedMessage());
System.out.println(ex.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL");
}
}
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 2");
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 3");
}
return conn;
}
public Connection AccederBD() {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
//Obtenemos la Conexión
conn = DriverManager.getConnection("jdbc:derby:.\\BD\\inventario.db");
if (conn != null) {
System.out.println("Base de Datos Ya Leida Correctamente");
//JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
}
} catch (SQLException e) {
System.out.println(e.getMessage());
System.out.println("NO SE ENCONTRO LA BASE DE DATOS");
System.out.println("CREANDO BASE DE DATOS EN DERBY DATABASE");
String createTableProyecto = "CREATE TABLE proyecto\n"
+ "(\n"
+ "idproyecto INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),\n"
+ "nombre VARCHAR(50) NOT NULL,\n"
+ "descripcion VARCHAR(1000),\n"
+ "CONSTRAINT proyecto_pk PRIMARY KEY (idproyecto)\n"
+ ")";
String createTablePrimera = "CREATE TABLE primera\n"
+ "(\n"
+ "idprimera INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),\n"
+ "nombre VARCHAR(75) NOT NULL,\n"
+ "descripcion VARCHAR(1000),\n"
+ "CONSTRAINT primera_pk PRIMARY KEY (idprimera)\n"
+ ") ";
String createTableSegunda = "CREATE TABLE segunda\n"
+ "(\n"
+ "idsegunda INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),\n"
+ "nombre VARCHAR(75) NOT NULL,\n"
+ "descripcion VARCHAR(1000),\n"
+ "CONSTRAINT segunda_pk PRIMARY KEY (idsegunda)\n"
+ ")";
String createTableEncabezado = "CREATE TABLE encabezado\n"
+ "(\n"
+ "idencabezado INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),\n"
+ "idproyecto INTEGER NOT NULL,\n"
+ "idprimera INTEGER NOT NULL,\n"
+ "idsegunda INTEGER NOT NULL,\n"
+ "fecha DATE NOT NULL,\n"
+ "CONSTRAINT encabezado_pk PRIMARY KEY (idencabezado)\n"
+ ")";
String createRelationCotizacionIdTopCoat = "ALTER TABLE ENCABEZADO ADD FOREIGN KEY (IDSEGUNDA) REFERENCES SEGUNDA(IDSEGUNDA)";
String createRelationCotizacionIdPrimer = "ALTER TABLE ENCABEZADO ADD FOREIGN KEY (IDPRIMERA) REFERENCES PRIMERA(IDPRIMERA)";
String createRelationCotizacionIdProyecto = "ALTER TABLE ENCABEZADO ADD FOREIGN KEY (IDPROYECTO) REFERENCES PROYECTO(IDPROYECTO)";
CrearBD(createTableProyecto);
CrearBD(createTablePrimera);
CrearBD(createTableSegunda);
CrearBD(createTableEncabezado);
CrearBD(createRelationCotizacionIdTopCoat);
CrearBD(createRelationCotizacionIdPrimer);
CrearBD(createRelationCotizacionIdProyecto);
//*************PRUEBAS*****************
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
System.out.println("ERROR DE TIPO ClassNotFoundException");
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN ACCEDER A LA BASE DE DATOS parte 2");
}
return conn;
}
public void UID(String sqlcad) {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\\BD\\inventario.db");
sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
sttm.executeUpdate(sqlcad);
System.out.println("Conexión Exitosa a la Base de Datos");
//JOptionPane.showMessageDialog(null, "Conexión exitosa");
sttm.close();
conn.close();
if (conn != null) {
System.out.println("Consulta Realizada Correctamente");
//JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
}
} catch (SQLException e) {
System.out.println("Error= " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println("Error= " + e.getMessage());
}
}
public ResultSet getvalores(String sqlcad) {
ResultSet rs = null;
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\\BD\\inventario.db");
sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
//String sqlcad = "Select nombre, descripcion from primera";
rs = sttm.executeQuery(sqlcad);
return rs;
} catch (Exception e) {
System.out.println("Error= " + e.getMessage());
return rs;
}
}
}
我使用另一个类来设置查询的字符串,如下所示:
import java.sql.ResultSet;
public class Primer {
ConnectionDerby c = new ConnectionDerby();
public void insertMaestroPrimera(String nombre, String descripcion) {
c.UID("INSERT INTO primera(nombre, descripcion) values('" + nombre + "','" + descripcion + "')");
}
public void updateMaestroPrimera(int id, String nombre, String descripcion) {
c.UID("UPDATE primera set nombre='" + nombre + "',descripcion='" + descripcion + "' where idprimera=" + id);
}
public void deleteMaestroPrimer(int id) {
c.UID("DELETE FROM primera where idprimera=" + id);
}
public ResultSet llenarTable() {
ResultSet rs = null;
String sql = "SELECT nombre, descripcion from primera ORDER BY nombre";
rs = c.getvalores(sql);
return rs;
}
public ResultSet obtenerDatos(String value) {
ResultSet rs = null;
String sql = "SELECT idprimera, nombre, descripcion from primera WHERE nombre = '" + value + "'";
rs = c.getvalores(sql);
return rs;
}
}
所以伙计们,我想要一些建议,因为当我在表encabezado中进行更新时,我遇到了以下错误:“Error=Statement.executeUpdate()无法使用返回ResultSet的语句调用。”和“Error=无法在请求的时间内获得锁”。我认为这是因为池连接太多,所以请任何人都可以帮助我提高性能,或者也许sql是错误的,我不知道,但其他表(primera、segonda、proyecto)中的CRUD工作得很好!顺便感谢您的时间!
你目前的设计有两个大问题:
>
每个方法必须在本地声明连接变量。您将连接声明为一个字段,因此,如果两个线程同时访问同一个ConnectionDerby对象实例执行不同操作,则会陷入竞争状态,从而出现奇怪的问题,如此错误消息中发布的错误:error=Statement。不能使用返回结果集的语句调用executeUpdate(),这意味着线程a尝试在同一时间对同一实例执行更新,线程B尝试在同一时间对同一实例执行读取操作,并且竞争条件混合了连接和语句实例。
您正在手动打开连接。这是一个坏主意,因为打开连接在性能方面成本很高。您应该改用数据库连接池。
话虽如此,您可以通过以下方式提高项目的性能并解决项目中的问题:
更多信息:
您可能没有使用JBoss,但答案中的概念也适用于这种情况。
我在应用程序中使用连接池(snaq.db.ConnectionPool)。连接池的初始化方式如下: 使用的DB池值是: 我的应用程序在某处泄漏连接(连接未被释放),因此连接池已耗尽。我现在已经修好了密码。 空闲超时后连接不应该关闭吗?如果这不是正确的假设,有没有办法关闭打开的空闲连接(仅通过java代码)?
问题内容: 您如何连接到Java中的MySQL数据库? 当我尝试时,我得到 要么 要么 问题答案: 是一种相当古老的做事方式。更好的方法是通过查找已经为您配置的应用服务器容器来获取一个: 或直接从数据库驱动程序实例化和配置一个: 然后从中获取连接,如上:
问题设置基于Web服务(Spring/Java、Tomcat7和MySql),其中每个用户都有自己的数据库,因此每个请求都需要自己的连接。由于所有数据库都是在运行时动态创建的,因此在启动之前静态配置它们不是一个选项。 为了优化数据库连接使用,数据库连接池的实现将是非常好的,对吗? 使用Java/Spring:如何为动态数据库创建连接池?我有点惊讶于这里缺少干净的选择 问题:Tomcat的连接池(以
null 提前谢了。
我正在为员工管理系统创建一个web应用程序,使用ApacheTomcat作为HTTP服务器,Oracle作为数据库,applet用于客户端编程,servlet用于服务器端编程。我还想使用DBCP来管理与数据库的连接。 我希望执行查询的servlet使用客户端为连接输入的用户名和密码。但是到目前为止,我看到在中配置资源时必须设置连接池的用户名和密码。 有没有什么方法可以实现这一点并且仍然使用DBCP
本文向大家介绍java连接mysql数据库 java连接sql server数据库,包括了java连接mysql数据库 java连接sql server数据库的使用技巧和注意事项,需要的朋友参考一下 在java的应用中,我们经常会对数据库进行必要的操作,下来我们就了解一下如何用java连接mysql数据库 以及java连接sql server数据库 一、mysql 二、sql server 以上就