我使用Mysql数据库和jdbc连接在java服务器上工作
当我尝试执行以下步骤时出现问题
1.启动服务器
2.手动(使用phmypadmin)在数据库中插入新记录。
3.使用jdbc api
选择记录我只获取数据库中已有的记录,而不是新记录。
这是我的联系:
public JDBCMySQL(String nomFitxerPropietats) throws Exception {
if (nomFitxerPropietats == null) {
nomFitxerPropietats = "jdbcMysql.txt";
}
Properties props = new Properties();
try {
props.load(new FileReader(nomFitxerPropietats));
} catch (FileNotFoundException ex) {
throw new Exception("No es troba fitxer de propietats", ex);
} catch (IOException ex) {
throw new Exception("Error en carregar fitxer de propietats", ex);
}
String driver = props.getProperty("driver");
if (driver == null && System.getProperty("java.version").compareTo("1.6") < 0) {
throw new Exception("La versió de Java obliga a definir la propietat driver dins el fitxer de propietats");
}
String url = props.getProperty("url");
if (url == null) {
throw new Exception("Manca la propietat url en el fitxer de propietats");
}
String user = props.getProperty("user");
String password = props.getProperty("password");
// No controlem !=null per què hi ha SGBDR que permeten no indicar user/contrasenya (MsAccess)
try {
if (driver != null) {
Class.forName(driver);
}
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
} catch (SQLException ex) {
throw new Exception("No es pot establir connexió", ex);
} catch (ClassNotFoundException ex) {
throw new Exception("No es pot carregar la classe " + driver);
}
}
这是我用来检索记录的功能:
@Override
public List<Cita> getCitas(int sesID) {
List<Cita> citas = new ArrayList<Cita>();
try {
Statement st = null;
ResultSet rs = null;
String consulta = " select iii.estatinforme,s.NUMERO,c.diahora, s.PERIT_NO,s.INFORME_NO,s.POLISSA_ID,s.DATAASSIGNACIO,s.DATAOBERTURA,s.DATATANCAMENT,s.DESCRIPCIOSINISTRE,s.TIPUSSINISTRE,s.ESTATSINISTRE,s.polissa_id,p.municipi from SINISTRE s join POLISSA p on (s.polissa_id = p.ID_POLISSA) join PERIT pe on ( pe.NUMERO = s.PERIT_NO) join CITA c on (c.sinistre_id = s.numero) left join INFORMEPERICIAL iii on (c.sinistre_id=iii.sinistre_id) where ( s.PERIT_NO = ? and (iii.ESTATINFORME = 'PENDENT' or iii.ESTATINFORME is null or DATE_FORMAT(c.diahora, '%Y-%m-%d') = CURDATE() )) order by c.diahora ";
PreparedStatement pstmt = con.prepareStatement(consulta);
pstmt.setInt(1, sesID);
rs = pstmt.executeQuery();
while (rs.next()) {
//handling my reads...
}
pstmt.close();
rs.close();
} catch (SQLException ex) {
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
return citas;
}
我怀疑它与准备好的语句或查询无关,因为在我停止服务器并再次启动它之后,将使用GetCitas()函数检索新的。
已编辑:配置文件我正在使用(jdbcMysql.txt):
URL = JDBC:MySQL的:// MYIP:3306 / mydb的
用户= myuser的
密码=为mypass
答案 0 :(得分:2)
总而言之,这似乎是Transaction Isolation的一个问题。
基本上,只要某些事务没有提交插入或更新的数据,就无法在另一个程序中看到它。
同样,只要您的交易处于开放状态,您将始终获得数据库在交易开始时所具有的相同状态。
设置autocommit = false后,您在程序中很早就启动了该事务,只要您没有commit()
您的事务,您就会看到相同的快照(至少使用默认的mysql事务隔离REPEATABLE READ到位)
这就是为什么在您选择之前手动commit()
连接的原因。
一致阅读
使用快照信息的读取操作 根据时间点呈现查询结果,无论更改如何 由同时运行的其他事务执行。如果查询 数据已被另一个事务更改,原始数据是 基于撤消日志的内容重建。这种技术 避免一些可能降低并发性的锁定问题 强制交易等待其他交易完成。
关于另一个主题:您的代码可以从一些清理中受益匪浅 - 请参阅以下使用try-with-resource实现getCitas:
@Override
public List<Cita> getCitas(int sesID) {
List<Cita> citas = new ArrayList<Cita>();
String consulta = "select iii.estatinforme,s.NUMERO, [...]";
try (PreparedStatement pstmt = con.prepareStatement()) {
pstmt.setInt(1, sesID);
try(ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
//handling my reads...
}
}
} //Closing happend automatically! Even in case of an error!
catch (SQLException ex) {
Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
}
return citas;
}