diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index 357b81f..b02f4a6 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -51,6 +51,7 @@
     public int SubmitSeed(String begid,Seed seed);//提交种子，返回状态：0 success，1 重复，2其他原因
     public void SettleBeg();//结算所有求种信息，求种信息中需要增加Beg截止日期，默认14天，期间投票>的则Beg成功，否则Beg失败，并发放对应奖励
 
+    public Post[] SearchPost(String userQ);//传入搜索的关键词或句子，返回搜索到的帖子信息（按照公共字符数量排序）
     public Post[] GetPostList();//获取用户的帖子列表
     public Post GetPost(String postid);//获取一个帖子的详细信息
     public PostReply[] GetPostReplyList(String postid);//获取一个帖子的回复列表
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 580f9e8..b91e471 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -39,15 +39,15 @@
 import entity.config;
 import entity.PostReply;
 import entity.QPostReply;
+import entity.UserInvite;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class Database1 implements DataManagerInterface {
-    @PersistenceContext
-    private final EntityManager entitymanager;
     private static final Logger logger = LoggerFactory.getLogger(Database1.class);
     private EntityManagerFactory emf;
+    
     public Database1() {
         config cfg = new config();
         Map<String,Object> props = new HashMap<>();
@@ -55,9 +55,15 @@
                   "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
         props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
-        this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
-        // this.emf=entitymanager;
+        // 只创建一个 EntityManagerFactory，为每个操作创建新的 EntityManager
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
     }
+    
+    // 为每个操作创建新的 EntityManager 以避免线程安全问题
+    private EntityManager createEntityManager() {
+        return emf.createEntityManager();
+    }
+
     @Override
     public String LoginUser(User userinfo){
         try {
@@ -73,6 +79,7 @@
                 return null;
             }
             
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User foundUser = null;
@@ -97,14 +104,15 @@
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
     public int RegisterUser(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try{
             // 首先检查该邮箱是否在UserInvite表中被邀请过
-            JPAQuery<String> inviteQuery = new JPAQuery<>(entitymanager);
+            JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
             QUserInvite ui = QUserInvite.userInvite;
-            List<String> invitedEmails = inviteQuery.select(ui.inviterEmail).from(ui).fetch();
+            List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
 
             // 如果邮箱不在被邀请列表中，拒绝注册
-            if(!invitedEmails.contains(userinfo.email)){
+            if(UserInvites.isEmpty()){
                 return 2; // 未被邀请
             }
 
@@ -117,8 +125,23 @@
                 return 1; // 邮箱重复
             }
 
+            UserPT userPT = new UserPT();
+            userPT.userid = userinfo.userid;
+            userPT.magic = 0; // 设置默认值
+            userPT.upload = 0; // 设置默认值
+            userPT.download = 0; // 设置默认值
+            userPT.share = 0.0; // 设置默认值
+            userPT.user = userinfo; // 设置关联关系
+            userPT.farmurl = ""; // 设置默认值
+            userPT.viptime = 0; // 设置默认值
+
             entitymanager.getTransaction().begin();
             entitymanager.persist(userinfo);
+            entitymanager.persist(userPT);
+            // 删除所有匹配的邀请记录
+            for (UserInvite invite : UserInvites) {
+                entitymanager.remove(invite);
+            }
             entitymanager.getTransaction().commit();
             return 0; // 注册成功
 
@@ -135,11 +158,12 @@
     // 返回状态：0 success，1 不存在，2其他原因
     @Override
     public int UpdateInformation(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            
+
             entitymanager.getTransaction().begin();
             
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
@@ -177,6 +201,7 @@
     // 返回用户的全部基本信息
     @Override
     public User GetInformation(String userid){
+        EntityManager entitymanager = createEntityManager();
         User user = entitymanager.find(User.class, userid);
         return user;
     }
@@ -184,6 +209,7 @@
     //返回用户的全部pt站信息
     @Override
     public UserPT GetInformationPT(String userid){
+        EntityManager entitymanager = createEntityManager();
         UserPT userPT = entitymanager.find(UserPT.class, userid);
         return userPT;
     }
@@ -192,6 +218,7 @@
     @Override
     public int UpdateInformationPT(UserPT userinfo){
         try{
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
@@ -212,6 +239,7 @@
     //返回状态：0 success，1 id重复，2其他原因
     @Override
     public int RegisterUserPT(UserPT userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             
@@ -238,30 +266,58 @@
     //返回种子的全部信息
     @Override
     public Seed GetSeedInformation(String seedid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
-        return seed;
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            Seed seed = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedid.eq(seedid)).fetchOne();
+            return seed;
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByTag(String tag){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seedtag.eq(tag)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedtag.eq(tag)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByUser(String userid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seeduserid.eq(userid)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public int DeleteSeed(String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             Seed seed = entitymanager.find(Seed.class, seedid);
@@ -284,6 +340,7 @@
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
@@ -315,6 +372,7 @@
     @Override
     public int UpdateSeed(Seed seedinfo){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
@@ -333,28 +391,37 @@
     //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     @Override
     public Seed[] SearchSeed(String userQ){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).fetch();
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .fetch();
 
-        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+            if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+                return seeds.toArray(new Seed[0]);
+            }
+
+            String processedQuery = userQ.toLowerCase().trim();
+            Map<Seed, Integer> seedCountMap = new HashMap<>();
+            for(Seed seed : seeds){
+                String title = seed.title.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                seedCountMap.put(seed, count);
+            }
+            seeds.sort((s1, s2) -> {
+                int count1 = seedCountMap.getOrDefault(s1, 0);
+                int count2 = seedCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
         }
-
-        String processedQuery = userQ.toLowerCase().trim();
-        Map<Seed, Integer> seedCountMap = new HashMap<>();
-        for(Seed seed : seeds){
-            String title = seed.title.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            seedCountMap.put(seed, count);
-        }
-        seeds.sort((s1, s2) -> {
-            int count1 = seedCountMap.getOrDefault(s1, 0);
-            int count2 = seedCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return seeds.toArray(new Seed[0]);
     }
 
     //计算字符串公共字符数量
@@ -388,6 +455,7 @@
     @Override
     public int AddNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
@@ -408,6 +476,7 @@
     @Override
     public boolean UpdateNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
@@ -425,6 +494,7 @@
     @Override
     public boolean DeleteNotice(String noticeid){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice notice = entitymanager.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
@@ -441,6 +511,7 @@
     //获取用户的剩余邀请次数
     public int GetUserAvailableInviteTimes(String userid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
@@ -457,6 +528,7 @@
     @Override
     public int InviteUser(String inviterid,String inviteemail){
         try {
+            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -477,6 +549,7 @@
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
         QUser u2 = QUser.user;
         User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
@@ -507,6 +580,7 @@
     @Override
     public boolean DeleteCollect(String userid,String seedid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
@@ -532,6 +606,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -577,6 +652,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -619,6 +695,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -657,6 +734,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -717,6 +795,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -771,6 +850,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -844,6 +924,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -894,6 +975,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -1426,6 +1508,7 @@
 
     @Override
     public Post[] GetPostList() {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         List<Post> posts = query.select(p).from(p).fetch();
@@ -1434,6 +1517,7 @@
 
     @Override
     public Post GetPost(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
@@ -1442,10 +1526,38 @@
 
     @Override
     public PostReply[] GetPostReplyList(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
         QPostReply p = QPostReply.postReply;
         List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
         return replies.toArray(new PostReply[0]);
     }
+
+    @Override
+    public Post[] SearchPost(String postQ) {
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+        QPost p = QPost.post;
+        List<Post> posts = query.select(p).from(p).fetch();
+
+        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            return posts.toArray(new Post[0]);
+        }
+
+        String processedQuery = postQ.toLowerCase().trim();
+        Map<Post, Integer> postCountMap = new HashMap<>();
+        for(Post post : posts){
+            String title = post.posttitle.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            postCountMap.put(post, count);
+        }
+        posts.sort((s1, s2) -> {
+            int count1 = postCountMap.getOrDefault(s1, 0);
+            int count2 = postCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return posts.toArray(new Post[0]);
+    }
 }
 
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index d7c5eee..0166081 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -1116,4 +1116,9 @@
     public PostReply[] GetPostReplyList(String postid) {
         return null;
     }
+
+    @Override
+    public Post[] SearchPost(String userQ) {
+        return null;
+    }
 }
\ No newline at end of file
