标签: java

未看到 MySQL 提交的数据来选择查询

上下文:使用的框架是 Spring,所有查询都使用 JdbcTemplate 运行。Mysql Server 版本为 5.6.19。这table是一个InnoDB table和默认值,并且设置了auto commit隔离级别可重复读取。

问题Insert一个事务发生在一个事务中select,读取插入的相同数据的一个没有看到数据。在select运行后,insert之后的insert交易都有commited

我在 mysql 中启用了 bin 日志和一般日志。相关日志如下

二进制日志:

SET TIMESTAMP=1438265764/*!*/;
BEGIN
/*!*/;
# at 249935389
#150730 14:16:04 server id 1  end_log_pos 249935606 CRC32 0xa6aca292    Query   thread_id=40    exec_time=0     error_code=0
SET TIMESTAMP=1438265764/*!*/;
insert into user_geo_loc_latest(user_id, lat, lng) values(x,y,z) on duplicate key update lat=y, lng=z
/*!*/;
# at 249935606
#150730 14:16:06 server id 1 …
Run Code Online (Sandbox Code Playgroud)

mysql transaction java mysql-5.6

13
推荐指数
1
解决办法
5123
查看次数

大批量插入速度

在我的应用程序中,我的 INSERT 似乎占用了大部分时间。我在内存中有大量对象(~40-50,000),我想将它们插入到表中。

让我们拿一个样本表

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

以 3 行作为我的批量大小,以下是我能想到的插入方法

方法 1 - 构建并触发 3 个原始插入

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');
Run Code Online (Sandbox Code Playgroud)

方法 2 - 将值合并到 1 个查询中

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 …
Run Code Online (Sandbox Code Playgroud)

mysql innodb insert jdbc java

11
推荐指数
1
解决办法
1万
查看次数

Oracle 数据库是否在内部使用 Java?

我的问题很简单。Oracle 是否在其 DBMS 内部使用 Java?

oracle java

10
推荐指数
1
解决办法
5368
查看次数

为什么 Oracle 对补充 unicode 字符花栗鼠使用与 java 不同的字节长度?

我有 java 代码将 UTF-8 字符串修剪为我的 Oracle (11.2.0.4.0) 列的大小,最终抛出错误,因为 java 和 Oracle 将字符串视为不同的字节长度。我已经验证我NLS_CHARACTERSET在 Oracle 中的参数是“UTF8”。

我写了一个测试,使用unicode 花栗鼠表情符号(?)

public void test() throws UnsupportedEncodingException, SQLException {
    String squirrel = "\uD83D\uDC3F\uFE0F";
    int squirrelByteLength = squirrel.getBytes("UTF-8").length; //this is 7
    Connection connection = dataSource.getConnection();

    connection.prepareStatement("drop table temp").execute();

    connection.prepareStatement("create table temp (foo varchar2(" + String.valueOf(squirrelByteLength) + "))").execute();

    PreparedStatement statement = connection.prepareStatement("insert into temp (foo) values (?)");
    statement.setString(1, squirrel);
    statement.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

这在测试的最后一行失败,并显示以下消息:

ORA-12899: 列
"MYSCHEMA"."TEMP"."FOO" 的值太大(实际:9,最大值:7)

的设置NLS_LENGTH_SEMANTICSBYTE。不幸的是,我无法改变它,因为它是一个遗留系统。我对增加列大小不感兴趣,只是能够可靠地预测字符串的 Oracle 大小。

oracle java utf-8 unicode

9
推荐指数
1
解决办法
2160
查看次数

Oracle 11g:插入的性能改进

我有一个包含 5 亿行(并且还在增长)的表

我做了以下工作来提高插入的性能:

在数据库端:

  • 删除所有索引和约束
  • 禁用日志记录

在应用方面:

  • 从 JPA 托管实体切换到本机插入查询,向查询添加了 APPEND Oracle 提示
  • 尝试每 1k/2k/3k 行批量提交
  • 尝试并行写入(多线程,线程数=服务器上的核心数)到一张表

这给了我大约每秒 300 行

另外试过:

  • 批量并行写入多个表(使用 UNION 分组然后返回结果)

这给了我每秒大约 1k 行,但在空表上。但是当我用虚拟数据(每个表 200 万)填充表时,插入速度下降到每秒 250 - 300 次。

谁能建议我还能做些什么来加速插入?基本上我想首先了解什么是(可能是什么)瓶颈。

UPD: 表按插入日期分区,表有大约 60 列 - 大多数列是 VARCHAR2(2000 BYTE)

oracle java

8
推荐指数
1
解决办法
1万
查看次数

从 CSV 文件批量更新/插入数据库

我正在实现从一个数据库到另一个数据库的特定于应用程序的数据导入功能。

我有一个包含 10000 行的 CSV 文件。这些行需要插入/更新到数据库中。

可能存在这样的情况,即数据库中可能存在几行,这意味着需要更新这些行。如果数据库中不存在,则需要插入它们。

一种可能的解决方案是,我可以一行一行地阅读,检查数据库中的条目并相应地构建插入/更新查询。但是这个过程可能需要很多时间来创建更新/插入查询并在数据库中执行它们。有时我的 CSV 文件可能有数百万条记录。

有没有其他更快的方法来实现这个功能?

oracle java

8
推荐指数
1
解决办法
2万
查看次数

如何在两个字段上使用 INNER JOIN 更新 SQLITE 列

如何将此查询转换为 SQLite:

UPDATE Table_1 
INNER JOIN Table_2 ON (Table_1.Field1 = Table_2.Field1) 
AND(Table_1.Field2 = Table_2.Field2)
SET Table_1.Field3 = Table_2.Field3
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。

UPDATE Table_1 
SET Field3 = (SELECT Field3
            FROM Table2
            WHERE (Field1 = Table_2.Field1)
            AND (Field2 = Table_2.Field2))
WHERE Field1 IN (SELECT Table_2.Field1
            FROM Table2
            WHERE (Field1 = Table_2.Field1)
            AND (Field2 = Table_2.Field2)) 
AND Field2 IN (SELECT Table_2.Field2
            FROM Table2
            WHERE (Field1 = Table_2.Field1)
            AND (Field2 = Table_2.Field2)) 
Run Code Online (Sandbox Code Playgroud)

查询有效,但我得到错误的结果。

sqlite java

8
推荐指数
1
解决办法
2万
查看次数

如何在mysql-workbench中查看表的内容

大家好,大家对 mysql 都很陌生,我做了一个 java 程序,将数据存储在 mysql 数据库中。我正在使用这个名为 mysql-workbench 的工具,它可以创建数据库、表等等。我想要做的是查看我刚刚在我的java程序中填充数据的表的所有内容。我知道可以使用一些 SQL 脚本查看表的所有内容,但是我想知道 mysql-workbench 是否可以显示表中的所有内容,而无需以一种表格形式或类似于它们显示内容的方式输入 SELECT mysql 脚本phpMyAdmin 中的表。

我想这样做的原因是我在那个表中有 2-3k 个条目并且使用控制台有点混乱。有关如何执行此操作的任何帮助或建议?提前致谢。

mysql mysql-workbench java

7
推荐指数
1
解决办法
5万
查看次数

从函数返回带有列名的 ResultSet

我有以下 postgresql 函数:

CREATE OR REPLACE FUNCTION readMessage(messageFor INT, qid INT = NULL, ctxt INT = NULL, messageFrom INT = NULL, byTimeStamp BOOLEAN = FALSE)
RETURNS SETOF message
AS $$
DECLARE
    sql varchar;
BEGIN
    sql := 'SELECT * FROM message WHERE (receiver_id IS NULL OR receiver_id = $1)';
    IF qid IS NOT NULL THEN
        sql := sql || ' AND queue_id = $2';
    END IF;
    IF ctxt IS NOT NULL THEN
        sql := sql || ' AND context = $3'; …
Run Code Online (Sandbox Code Playgroud)

postgresql java functions postgresql-9.1

7
推荐指数
1
解决办法
6867
查看次数

将函数参数添加到 SQL 查询 WHERE 子句

我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:

CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS 
$$
    SELECT .... FROM ...
    JOIN ...
    where true
    ;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是

AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)

Where 子句看起来像

where true AND speed = 0 AND ... 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑

也可以接受许多参数(a int、b string、c string ..)但是我需要有

WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)

这是不可接受的。我怎样才能做到这一点?

或者我可以在里面放一个 if 语句吗?喜欢

Select .. . from ...
JOIN ... 
WHERE true
IF (a …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql java functions

7
推荐指数
1
解决办法
1万
查看次数