我有 c++ 代码,可将实时数据泵入 mysql 数据库 c++ 代码如下:
const char* dropper = "DROP TABLE IF EXISTS orders";
const char* create_stmt = "CREATE TABLE `dbname`.`dummy` (`id` INT NOT NULL AUTO_INCREMENT,`example` VARCHAR(45) NOT NULL,PRIMARY KEY(`id`));";
void try2Connect()
{
MYSQL_RES* res_set;
MYSQL_ROW row;
mysql_init(&conn2);
if (!mysql_real_connect(&conn2, "ip", "uname", "pass", "dbname", port, NULL, 0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&conn2));
}
else {
fprintf(stderr, "Successfully connected to Database.\n");
}
mysql_query(&conn2, "SET SQL_SAFE_UPDATES = 0;");
isConnected2 = true;
}
void pumping_data(){
if (!isConnected2 || &conn2 == NULL) try2Connect();
if (isConnected2 == true) {
mysql_query(&conn2 , dropper);
mysql_query(&conn2 , create_stmt);
mysql_query(&conn2 , c);//c is insert statement which works perfectly fine
mysql_close(&conn2);
}
}
此时程序工作正常,但我需要在 java 中执行另一个程序,该程序必须与我的 java 代码中的订单表一起使用:
public void getDatas(){
try {
isConn();
Statement stmt = con.createStatement();
ResultSet rs = (ResultSet) stmt.executeQuery("CALL positioning_procedure();");
}
}
public void isConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
if(con==null || con.isClosed()) {
con = DriverManager.getConnection("...","username","pwd");
}
}catch (Exception e) {e.printStackTrace();}
}
我有一个像
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
getDatas();
}}, 500, 5000);
}
我的两个代码都可以正常工作
但是当我尝试在 sql 中执行我的两个程序时,发生了一个错误,说正在等待表元数据锁定,而我在 java 中工作的选择过程说选择但数据不流动我看到了一些人们说手动杀死的方法查询,但它必须实时工作,我尝试截断表插入删除表但结果相同
编辑 :
摘要:我的源表获得大量更新,因此当另一个查询尝试选择数据时它会挂起。当仍然有大量更新时,如何使我的选择查询正常工作。