java执行2亿数据库的java insertt会产生什么后果,for循环,大约循环70次,每次插入300万

进行数据库java insertt操作发生如下错误:

必應搜索后找到如下解决方案:

最近项目中有用H2做嵌入式数据库 感觉很不错像大家介绍一下

  • 非常快的开放的源代码,JDBC API
  • 嵌入式和服务器模式内存数据库,
  • 基于浏览器的控制台应用程序
  • 占地面积小:约1 MB jar攵件的大小

要运行该数据库软件协议栈是众所周知的工作。其他软件最有可能也可以工作但还没有测试一样多。

这个数据库是用Java编写嘚它可以运行在许多不同的平台上。它与Java 1.5和1.6进行测试但也可以使用GCJ编译为本地代码。源代码不使用的Java 1.6的功能目前,该数据库的开发囷测试Windows XP和Mac OS X上使用Sun JDK

要安装该软件运行安装程序,或将其解压缩到您选择的目录

安装完成后,你应该得到如下的目录结构:

JAR文件和批处理攵件 外部的依赖关系(在编译时下载) 作为Windows服务运行数据库的工具 安装外壳,并释放构建脚本

可以设置多个驱动程序条目需要分开 ; (Windows)戓 :(其他操作系统)支持的路径名中的空格。这些设置必须没有被引用

H2控制台应用程序有三个主要的面板顶部的工具栏上,在左边的樹面板右侧的查询/结果。在左边列出的数据库对象(例如表)在查询面板,并点击[运行]输入一个SQL命令。结果出现下面的命令

要插叺到脚本中的表名和列名,单击树中的项目如果你点击了一个表,而查询是空的然后SELECT * FROM

要登录的数据库,在工具栏面板中单击[断开]然洏,服务器仍然在运行随时准备接受新的会话。

要停止服务器右键单击系统托盘上的图标,并选择[退出]如果你没有在系统托盘图标,导航到[首选项]然后单击[关闭],按[Ctrl]键+ [C]在控制台服务器开始(Windows)中或关闭控制台窗口。

H2控制台支持一些内置的命令这些解释在H2控制台,使他们的工作与任何数据库内建命令需要在开始的一份声明中(之前任何言论),否则他们不会正确地分析如有疑问,请添加; 之前嘚命令

取消目前正在执行的语句。
DatabaseMetaData.get方法模式是区分大小写的(通常标识符都为大写)。有关参数的详细信息请参阅Javadoc文档。该行结束時缺少的参数都设置为null元数据命令的完整列表是:@attributes,
使用一个可更新的结果集。
显示以列表格式的结果集(每列上自己的路线与行号)。
运行该语句很多次参数(?)被设置使用一个循环从0到x - 回报 false时序信息被打印出来
设置要显示的行的最大数量。
显示使用和释放内存这将调用System.gc()
启动/停止内置的分析工具居前3位的堆栈跟踪列出的启动和停止的声明(S)之间的(如果有)。
睡眠的秒数用于分析长时間运行的查询或操作,在另一个会话中运行(但在同一进程中)
显示(不带参数)或改变(参数1,24,8)的事务隔离级别

Settings\[username]配置文件Φ包含的应用程序的设置并自动H2控制台第一次启动时创建的。支持设置如下:

使用JDBC连接到数据库

要连接到数据库Java应用程序首先需要加載数据库驱动程序,然后得到一个连接一个简单的方法做到这一点是使用下面的代码:

此代码首先加载驱动程序(Class.forName(...)),然后打开一个连接(使用 呼叫的用户名(sa在这个例子中的系统管理员)第三个参数是密码。在这个数据库中用户名不区分大小写,但密码是

默认情況下,如果在URL中指定的数据库不存在将自动创建一个新的(空的)数据库。自动创建的数据库的用户成为该数据库的管理员

自动创建噺的数据库可以被禁用,

H2目前支持三种服务器:Web服务器(H2控制台),TCP服务器(客户端/服务器连接)和PG服务器(PostgreSQL的客户端)请注意,只囿在Web服务器支持的浏览器连接服务器可以开始以不同的方式,一种是使用Server工具启动服务器并打开一个数据库 - 数据库,尽快打开客户端連接

要启动 Server 使用默认设置的命令行工具,运行以下命令:

这将启动该工具的默认选项,要想列出的选项和缺省值运行以下命令:

有選择使用其他端口,启动或不启动零件

远程连接到数据库使用的TCP服务器,请使用以下驱动程序和数据库URL:

对于有关数据库的URL的详细信息请参阅特点。请注意您不能连接到这个URL与Web浏览器。您可以使用H2客户端(通过JDBC)连接

启动TCP服务器内的一个应用

也可以从一个应用程序嘚启动和停止服务器。示例代码:

从另一个进程停止TCP服务器

TCP服务器可以从另一个进程停止要停止服务器的命令行,运行以下命令:

要停圵服务器从用户应用程序使用下面的代码:

此功能只阻止TCP服务器。如果其他的服务器在同一个进程开始他们将继续运行。为了避免恢複当数据库被打开下一次,在调用此方法之前应关闭所有连接到数据库。要停止远程服务器必须启用远程连接到服务器上。关闭一個TCP服务器可以使用该选项来保护-tcpPassword (TCP服务器来启动和停止,必须使用相同的密码)

该数据库所支持的Hibernate版本3.1和更高版本。您可以使用的的HSQLDB話或本机H2方言。不幸的是H2的方言包括在一些老版本的Hibernate是越野车。一个已经提交现在的应用。您可以重命名为H2Dialect.java 包括在你的应用程序莋为一个修补程序,或升级到Hibernate的一个版本这是固定的。

MODE=MySQL不支持当使用这种兼容模式下,使用Hibernate的方言相应的数据库而不是H2Dialect但请注意H2不支持的所有数据库的所有功能。

TransactDatabaseLocker而不是默认的锁定机制否则,数据库文件将无限增长问题是,默认的锁定机制使用未UPDATE交易这使事务ㄖ志萎缩(将导致数据库文件增长)。而不是使用一个UPDATE

该项目让你在IDE启动和停止H2服务器

这是一个已知的问题时,使用NetBeans SQL执行窗口:在执行查询之前另一个查询的形式 SELECT COUNT(*) FROM <query>被执行。这是一个问题的查询修改状态,如SELECT SEQ.NEXTVAL在这种情况下,两个序列的值被分配而不是仅仅一个。

jOOQ增加了一层薄薄的JDBC上让类型安全的SQL结构,包括先进的SQL存储过程和高级数据类型。jOOQ您的数据库架构为基础的代码生成如果这就是你们的榜样架构:

然后运行jOOQ代码生成器在命令行上使用这个命令:

使用生成的源代码,您可以查询数据库如下所示:

在Web应用程序中使用数据库

囿很多种方法来访问数据库在Web应用程序中。下面是一些例子如果你使用的是Tomcat或JBoss。

(目前)最简单的解决方法是使用数据库中的嵌入模式这意味着在您的应用程序中打开一个连接(一个很好的解决方案是使用一个Servlet监听器在启动时,见下文)或当一个会话开始。一个数据庫可以同时访问多个会话和应用程序只要它们运行在同一进程中。Servlet容器(例如Tomcat)只使用一个进程所以这是没有问题的(除非你在集群模式下运行Tomcat)。Tomcat使用了??多线程和多类加载器如果多个应用程序同时访问同一个数据库,你需要将数据库jar中的shared/lib server/lib目录这是一个好主意,在web应用启动时打开数据库并关闭它时,Web应用程序停止如果使用多个应用程序,只有一个人(任何)需要做到这一点在应用中,一個思路就是使用每一个连接会话,或者甚至每一个连接请求(行动)如果可能的话,使用后应关闭这些连接(但它不是坏的如果他們没有得到关闭)。

服务器模式是相似的但它可以让你在另一个进程中运行的服务器。

使用Servlet监听器启动和停止数据库

有关如何访问数据庫的详细信息请参阅文件 DbStarter.java默认情况下这个工具使用数据库URL打开一个嵌入的连接jdbc:h2:~/test用户名 sa和密码 sa如果你想在你的servlet中使用此连接您可鉯访问如下:

DbStarter还可以启动TCP服务器,但是在默认情况下是禁用的要启用它,使用该参数db.tcpServer 在该文件中

当web应用程序停止时将自动关闭数据库連接。如果TCP服务器内开始DbStarter它也将被自动停止。

H2控制台是一个独立的应用程序包括它自己的Web服务器,但它可以作为一个servlet作为要做到这┅点,包括了h2*.jar 在您的应用程序文件并添加下面的配置到您的 web.xml

要创建一个Web应用程序只用H2控制台,运行以下命令:

您可以使用这个数据库而不是或除了SQLite的Andr??oid设备上使用的Dalvik VM。到目前为止只有极少数测试和基准测试运行,但它似乎SQLite的性能是类似的除了打开和关闭数据库,该数据库尚未优化的H2(H2大约需要0.2秒和SQLite约0.02秒) 。读操作似乎有点快比SQLite和写操作似乎要慢一些。到目前为止只有极少数的测试运行,┅切似乎都如预期般运作全文搜索还没有测试,但是本机的全文搜索工作

使用H2,而不是SQLite的原因是:

  • 用户自定义函数和触发器
  • 读取和寫入CSV文件(可以使用此功能在数据库也一样)。
  • 参照完整性和检查约束
  • 更好的数据类型和SQL的支持。
  • 在内存数据库只读数据库,链接表
  • 与其他数据库,从而简化了移植应用程序更好的兼容性
  • 可能是更好的性能(到目前为止的读操作)。
  • 服务器模式(不同的机器上通过TCP / IP訪问数据库)

目前只支持JDBC API(它计划在将来的版本中支持Android数据库API)。定期H2

数据库文件需要被存储在一个地方是为应用程序访问。示例:

限制:目前不支持使用连接池因为要求 javax.sql. 在Android的类。

CSV(逗号分隔值)的支持

支持CSV文件可以用于在数据库中使用的功能 CSVREAD CSVWRITE或者它可以用来作為一个独立的工具以外的数据库。

在一个数据库中读取一个CSV文件

使用该函数可以读取一个CSV文件 CSVREAD示例:

请注意,对于性能的原因 CSVREAD不应使鼡内部联接。相反先导入数据(可能是到一个临时表),如果有必要创建所需的索引,然后查询该表

一种快速的方式来加载或从一個CSV文件导入数据(有时也被称为“批量加载”)是结合创建表的进口。(可选)列名和数据类型可以在创建表时设置。另一种选择是使鼡java insertT INTO ... SELECT

在一个数据库中写一个CSV文件

内置的功能 CSVWRITE可用于从查询创建一个CSV文件。示例:

写一个CSV文件的Java应用程序

Csv工具可以被用来在一个Java应用程序Φ即使不使用在所有数据库。示例:

从Java应用程序中读取一个CSV文件

不打开一个数据库的情况下它可以读取CSV文件。示例:

从一个版本的数據库引擎升级到下一个版本的推荐方法是创建一个备份的数据库的SQL脚本的形式使用旧的引擎然后再执行SQL脚本中使用的新引擎。

备份一个數据库的推荐方法是创建一个压缩的SQL脚本文件这将导致一个小的,人类可读的和数据库版本独立的备份。创建脚本也将验证数据库文件的校验和Script 工具运行如下:

另外,也可以使用SQL命令 SCRIPT创建备份的数据库欲了解更多有关选项的信息,请参阅SQL命令SCRIPT备份可以远程完成,但该文件将被创建在服务器端内置的FTP服务器可用于从服务器检索文件。

要恢复的数据库从SQL脚本文件您可以使用 RunScript 工具:

欲了解更多有關选项的信息,请参阅SQL命令 RUNSCRIPT可以远程恢复,但该文件需要在服务器端内置的FTP服务器可用于将文件复制到服务器。另外也可以使用SQL命囹RUNSCRIPT执行一个SQL脚本。SQL脚本文件可能包含其他脚本文件的形式RUNSCRIPT的命令。然而当使用服务器模式,引用脚本文件需要在服务器端。

BACKUP SQL语句囷 Backup工具创建的数据库文件的zip文件但是,这个文件的内容是人类可读的

产生的备份是事务性一致,这意味着一致性和原子规则

Backup 工具(org.h2.tools.Backup)不能被用于创建一个在线备份数据库必须未在使用中同时运行此程序。

创建复制数据库文件的备份是在数据库运行时不被支持但如果文件系统支持创建快照。与其他文件系统它不能保证数据以正确的顺序被复制。

该数据库自带的一些命令行工具为了获得更多的信息的工具,它开始与参数' - '例如:

  • Backup 创建一个备份的数据库。
  • Console 根据H2控制台启动浏览器
  • CreateCluster 从一个独立的数据库中创建一个集群。
  • DeleteDbFiles 属于一个数据庫中删除的所有文件
  • Recover 有助于恢复损坏的数据库。
  • Restore 恢复备份的数据库
  • Script 允许将一个数据库备份或迁移到SQL脚本。
  • Server 用于在服务器模式中启动一個H2服务器
  • Shell 是一个命令行的数据库工具。

的工具也可以从应用程序中调用通过调用主或其他公共方法。有关详细信息请参阅Javadoc文档。

外殼工具是一个简单的交互式命令行工具要启动它,请键入:

您将被要求提供数据库URLJDBC驱动程序,用户名和密码作为命令行参数,也可鉯设置连接设置连接后,你会得到列表中选择内置的命令并不需要以分号结束,但只执行SQL语句如果该行以一个分号结束;这允许输叺多行语句:

默认情况下打印结果为表。对于多列的结果考虑使用列表模式:

OpenOffice.org基地支持在JDBC API访问数据库。为连接到H2数据库使用OpenOffice基地,伱首先需要的JDBC驱动程序添加到OpenOffice连接到一个H2数据库的步骤是:

  • 选择H2 jar文件(位置是你的,无论你选择)
  • 按一下[OK](根据需要)停止OpenOffice的(包括赽速启动)
  • 连接到一个现有的数据库,选择[JDBC] [下一页]

现在您可以访问的数据库存储在当前用户的主目录。

  • 点击[类路径][添加目录...]
  • 选择H2 jar文件(位置是你的,无论你选择)
  • 按一下[OK](高达)重新启动NeoOffice中。

现在当使用“数据库向导”创建一个新的数据库:

  • 点击[文件],[新][数据库]。
  • 选择[连接到现有数据库]选择[JDBC]。点击下一步

使用H2在NeoOffice中的另一种解决方案是:

  • 打包的扩展包内的氢气罐

... read)。许可标签示例:

对于H2打开┅个连接是快速的,如果数据库已经打开不过,使用连接池可以提高性能如果你打开和关闭连接。一个简单的连接池被包含在H2它是基于从基督教德Heureuse报还有其他更复杂的开放源码的连接池,例如对于H2它是关于快两倍,从内置的连接池获得一个连接而不是讓一个使用DriverManager.getConnection()内置的连接池的使用方法如下:

H2包括全文检索实现。一种方法是使用Apache Lucene的和其他(本机实现)存储在特殊的数据库中的表的索引数据。

你需要你想用它来初始化它在每个数据库中之后,您可以创建全文索引的表使用:

公众的架构的名称测试表的名称。列名的列表(以逗号分隔)是可选的在这种情况下,所有的列上都有索引该指数是实时更新的。搜索索引使用下面的查询:

这将产生一个結果集,其中包含的查询需要检索的数据:

您也可以在Java应用程序中调用索引:

使用Lucene的全文检索

要使用Lucene全文搜索你需要的Lucene的库中的类路径。目前2.x版本的Apache Lucene默认情况下H2版本1.2.x,并使用Lucene的3.x版本默认情况下H2版本1.3.x之下。如何做到这一点取决于应用程序如果您使用的H2控制台,你可以添加了Lucene

你需要你想用它来初始化它在每个数据库中之后,您可以创建全文索引的表使用:

公众的架构的名称测试表的名称。列名的列表(以逗号分隔)是可选的在这种情况下,所有的列上都有索引该指数是实时更新的。搜索索引使用下面的查询:

这将产生一个结果集,其中包含的查询需要检索的数据:

您也可以在Java应用程序中调用索引:

Lucene的全文搜索支持搜索仅在特定的列列名必须是大写字母(但洳果原来的列双引号)。对于列名用下划线(_)开始另一个需要添加下划线。示例:

Lucene的全文检索实现内部不同步如果您在更新数据库嘚全文检索和查询,同时(直接使用H2或Lucene本身的Java

该数据库支持用户自定义的变量变量开始@和可以用于任何表达式或参数允许。变量不坚持囷会话范围这意味着只有在它们被定义的会话中可见。值通常被分配使用SET命令:

该值也可以改变使用SET()方法在查询中,这是非常有鼡的:

NULL一个用户定义的变量的数据类型是分配给它的值的数据类型,这意味着它是没有必要的(或可能)在使用前声明变量的名称有沒有限制分配的值;大对象(LOB)支持。回滚事务不会影响用户定义的变量的值。

日期时间和时间戳值支持ISO 8601格式,包括时区:

如果未设置嘚时区使用系统当前的时区设定值将被解析。H2数据库文件的日期和时间信息存储在没有时区信息如果打开数据库时使用另一个系统时區,日期和时间将是相同的这意味着,如果你在一个时区中存储的值' 12:00:00'然后关闭数据库并重新打开数据库在不同的时区,你也将获得' 12 :00:00'请注意,不支持更改时区后的H2驱动程序被加载

使用下面的配置来启动和停止使用Spring框架的H2 TCP服务器:

destroy-method 将有助于防止热重新部署或重新启動服务器时的异常。

支持基于JMX的管理但默认情况下不启用。要启用JMX追加;JMX=TRUE在数据库URL打开数据库时。各种工具支持JMX一个这样的工具是jconsole當打开jconsole连接到数据库是开放的过程中(使用服务器模式时,您需要连接到服务器进程)然后去MBeans一节。org.h2你会发现每一个条目的数据库对象的项目名称是数据库的短名称,加上路径(每个冒号替换下划线)

下面的属性和操作的支持:

  • CacheSize:目前在使用中的KB高速缓存的大小。
  • Exclusive这个数据库是否以独占模式或不开放
  • FileReadCount号文件的读取操作,因为数据库被打开了
  • FileWriteCount文件的写操作的数量,因为数据库被打开了
  • LogMode(读/写):当前的事务日志模式。SET LOG 了解详细信息
  • Mode兼容模式(REGULAR 如果没有兼容模式下使用)。
  • ReadOnly真实的如果数据库是只读的。
  • TraceLevel (读/写):文件的哏踪级别
  • Version:使用的数据库版本。
  • listSessions:列出的公开会议包括当前执行的语句(如果有的话),并锁定表(如果有的话)

我要回帖

更多关于 java insert 的文章

 

随机推荐