线程中的Java线程
我有一个将标题和详细信息数据插入数据库表的应用程序(2个表1用于标题信息,1个用于详细信息)。我目前的方法是在线程中平均分配细节。标题将包含平均100000个详细信息 我想改变处理多个标题的方法。我将把1头的逻辑封装在一个函数中(这个函数将包含多线程的细节),并在几个线程(头的数量)或线程池(使用执行器)中调用这个函数线程中的Java线程,java,multithreading,threadpool,executor,Java,Multithreading,Threadpool,Executor,我有一个将标题和详细信息数据插入数据库表的应用程序(2个表1用于标题信息,1个用于详细信息)。我目前的方法是在线程中平均分配细节。标题将包含平均100000个详细信息 我想改变处理多个标题的方法。我将把1头的逻辑封装在一个函数中(这个函数将包含多线程的细节),并在几个线程(头的数量)或线程池(使用执行器)中调用这个函数 这是解决这一问题的最佳方式还是有解决这一问题的最佳实践?为线程设置优先级也会影响线程的流吗?(我将为标题设置更高的优先级,并保留默认的详细信息)考虑到您描述的问题的性质,应用程序
这是解决这一问题的最佳方式还是有解决这一问题的最佳实践?为线程设置优先级也会影响线程的流吗?(我将为标题设置更高的优先级,并保留默认的详细信息)考虑到您描述的问题的性质,应用程序的主要瓶颈可能是数据库I/O。这应该首先解决。一些常见做法:
- 考虑数据库事务的粒度:如果在一个事务中分组多个详细信息插入,将比一次插入一个详细信息(在自动提交模式下会发生这种情况)获得更好的性能
- 使用并优化数据库连接池,这样就可以让多个线程同时执行数据库操作,而不会给数据库服务器带来太多负担
- 请记住,DB操作大多是I/O绑定的,因此您可能会使用比核心更多的线程
- 如果适用,请使用执行器服务,而不是创建自己的线程,这样您就不必自己管理线程的生命周期
线程类或摆弄优先级)。我会分离线程,这样您就有了处理线程和一个在数据库中插入的线程。它们之间有一个BlockingQueue
,用于传递要插入数据库的处理数据。通过这种方式,您可以测试哪些线程有用(在处理阶段),哪些线程不太有用(在DB插入阶段),并相应地调整执行器的大小。