我有一个服务端点,基本上将一些数据插入到mysql中。我正在寻找在mysql中插入行的最快方法。
我不介意它是非常冗长还是需要更长时间才能进行更改(与使用hibernate相比),因为这个servlet的范围非常小,但性能确实是最重要的。
我对java / servlets很新,所以请不要遗漏任何细节或者在我的最后承担很多细节。
答案 0 :(得分:4)
最快的方法可能是直接使用JDBC驱动程序并自己编写SQL。 以下是一些看起来不错的示例代码:http://www.roseindia.net/jdbc/jdbc-mysql/InsertValues.shtml
人们使用Hibernate有很多原因。除了使类更简单地将类映射到数据库表之外,它还处理缓存,连接池和类似的东西。打开一个新的数据库连接会花费很多时间,所以你必须自己实现这样的东西,以使servlet运行良好。
答案 1 :(得分:2)
最快的方法是通过JDBC批量插入:
答案 2 :(得分:2)
使用JDBC和不同方法比较插入速度。它适用于PostgreSQL,但MySQL的方法和结果类似:http://rostislav-matl.blogspot.com/2011/08/fast-inserts-to-postgresql-with-jdbc.html。
简而言之:使用批处理插入(可能在任何JDBC驱动程序中支持),并且在可用的地方考虑COPY FROM。
答案 3 :(得分:0)
请务必使用连接池或类似的东西。这是迄今为止最大的因素。
使用实际持久存在于servlet请求中的PrepraredStatement
也可能有助于避免MySQL每次都解析请求。
只需保持数据库连接以及PreparedStatement
中的ThreadLocal
,即可假设servlet容器使用线程池。
更新: c3p0显然实现了连接和语句池,所以我只是使用它。
答案 4 :(得分:0)
如果您不使用JPA,我建议您使用Spring中的JdbcTemplate(即使您不使用Spring)来管理连接(关闭它们等)。
使用PreparedStatements。
不要直接初始化驱动程序/连接。而是使用在应用程序服务器中配置的池化DataSource(可以使用@Resource注入它)。
使用EJB进行事务管理。
答案 5 :(得分:0)
如果您只插入一行,那么简单的插入(可能是准备好的查询)可能是最快的。使用连接池,这样您就不必每次都连接,并且数据库上有调整参数会产生影响。
如果你能逃脱它,我建议不要在servlet中实际插入,而只是将数据放入由另一个线程插入数据库的内存队列中。但是,您不会知道它是否在servlet响应中成功。
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html