Khi nào thì session hết hạn (sql alchemy + postgresql)?

Chào cả nhà,
Mình đang làm app, mỗi lần start app thì sẽ dùng code dưới để tạo engine và session dùng cho suốt app

engine = create_engine('postgresql-string-here')

# Mỗi khi sử dụng sẽ kiểu
session = sessionmaker(engine)
try:
    session.add(some_object)
    session.add(some_other_object)
    session.commit()
except:
    # Do sm
finally:
    session.close()
    session.remove()

Mình muốn hỏi:

  • Session hoặc engine có bao giờ expired không nhỉ? Mình có coi ở document thì không thấy đề cập, chỉ là có dùng một số hàm để force expire thôi à.
  • Trong lúc app đang chạy, mình có nghịch thử vào database CLI để đổi pass, mình cũng không thấy nó lỗi mà vẫn chạy bình thường. Mọi người có thể giải thích cho mình tại sao nó như vậy được không? Liệu nó có lỗi kiểu như khi hết hạn, nó renew không được chẳng hạn?
    Cảm ơn cả nhà rất nhiều.
2 Likes

Sẽ có 3 trường hợp xảy ra nhé:

Kết thúc session sau 30 phút nếu không tương tác

Trong Google Analytics, mỗi session sẽ được tính khi người dùng bắt đầu truy cập vào trang web đó. Nếu không có bất kỳ hành động, tương tác với trang thì session sẽ được kết thúc trong 30 phút. Tuy nhiên, bạn vẫn có thể thay đổi giới hạn thời gian này nếu muốn tùy theo nhu cầu.

Bên cạnh đó, session cũng có khả năng kết thúc khi bạn đóng trình duyệt mình đang sử dụng hoặc chuyển sang trang web với tên miền khác.Nếu bạn quay lại trang web vừa sử dụng trong khoảng thời gian 30 phút giới hạn thì session cũ vẫn được duy trì tiếp theo. Trong khoảng thời gian này, nếu bạn tương tác với trang web thì lúc này, Google Analytics sẽ tiếp tục gia hạn cho bạn thêm 30 phút tiếp theo.

Tự động chấm dứt sau 12 giờ

Thời gian quy định là 30 phút sẽ không còn đúng khi bạn truy cập vào trang web lúc 12 giờ sáng. Khi truy cập vào thời gian này, những session cũ của 12 giờ trước sẽ bị kết thúc và một session mới sẽ được tạo ra vào 12 giờ sáng lúc đó.Có thể hiểu một cách đơn giản, các session sẽ tự động kết thúc khi chuyển sang ngày mới chứ không theo quy tắc 30 phút.

Một vài trường hợp khác

Session sẽ tự kết thúc khi có sự thay đổi về chiến dịch trực tuyến: khi bạn tìm kiếm từ khóa nào đó và truy cập trang web, một session sẽ được mở ra. Sau đó bạn tiếp tục truy cập vào một trang khác để tìm từ khóa thì một session khác tiếp tục được mở. Lúc này bạn đang có 2 từ khóa và 2 session.Khi sử dụng hai trình duyệt khác nhau cùng một lúc: một session mới được mở ra khi session cũ chưa kết thúc xảy ra nếu bạn mở hai trình duyệt khác nhau (kể cả tap ẩn danh).

5 Likes

Cảm ơn bạn, đây là kiến thức về session nói chung. Không phải trong case chính xác của mình. Nhưng bạn list ra chi tiết quá nên mình cũng biết thêm kiến thức về nó.

Chủ topic đang hỏi về session trong database mà nhỉ :thinking:

2 Likes

Summary:

SQLAlchemy bạn có thể hiểu là 1 toolkit (library) xây dựng trên DBAPI [0] trong Python, các khái niệm về Engine, Session có thể hiểu là 1 Layer để bạn dễ làm việc với database hơn (thay vì query -> fetchall -> Deserialize -> Python Objects) thì những Layers đó tự động hóa các việc đó.

Có, vì SQLAlchemy là 1 layer nên việc timeout được xử lý ở tầng dưới (ví dụ như Psycopg2), hoặc Postgres server của bạn tự đóng connection để phục vụ connection khác.

Nếu bạn dùng Flask + Flask SQLAchemy thì sau khi kết thúc request context, SQLAlchemy session sẽ được tự động đóng. Mặc dù wsgi (Werkzeug) vẫn chạy nhưng các kết nối với db sẽ được đóng sau khi request kết thúc. Không rõ có trả lời câu hỏi của bạn không?

[0]: https://peps.python.org/pep-0249/ chỉ là 1 interface để các thư viện tương tác với DB nhất định, ví dụ trong trường hợp của bạn, concrete implementation trong connection string là postgresql, DBAPI tương ứng có thể dùng là thư viện psycopg2

PS: Singularity vẫn đang tuyển bạn LTV Python https://jobs.singularity.vn/13b9b34e-ac33-4858-a7e1-6530551937f3

9 Likes

Trời đất, hầu như bài nào em hỏi cũng có bác trả lời hết. Chân thành cảm ơn bác rất nhiều, em đã hiểu hơn về vấn đề của mình rồi. Em phát sợ với kiến thức của bác, cái gì bác cũng biết tường tận gốc rễ, hay thiệt sự ạ.
Nếu được em rất mong bác chia sẻ phương pháp học tập của bác, sau những lần gặp vấn đề thế này em mới thấy kiến thức của mình còn quá hạn chế.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?