Cache dropdown contents until admin makes them dirty (custom, org, for example)
ctrager opened this issue · 29 comments
This is pulling up the issue create form
SQL 1:/check_user_permissions/ select * from sessions
inner join users on se_user = us_id
where se_id = '46db6f69-dad5-49de-b9d3-c4e15d4724f4'; /*check_user_permissions */
SQL 2:select og_id, og_name from organizations where og_is_active = true union select 0, '[None]' order by og_name
SQL 3:select us_id, us_username from users where us_is_active = true order by us_username
SQL 4:select c1_id, c1_name from custom_1 where c1_is_active = true order by c1_name
SQL 5:select c2_id, c2_name from custom_2 where c2_is_active = true order by c2_name
SQL 6:select c4_id, c4_name from custom_4 where c4_is_active = true order by c4_name
SQL 7:select og_id, og_name from organizations where og_is_default is true order by og_name limit 1
SQL 8:select c1_id from custom_1 where c1_is_default is true order by c1_name limit 1
SQL 9:select c2_id from custom_2 where c2_is_default is true order by c2_name limit 1
SQL 10:select c4_id from custom_4 where c4_is_default is true order by c4_name limit 1
layout_si
Maybe use EF. Can cache.
Or some service with manual memory caching.
The lifecycle of the app, it's like a normal C# program. When it starts running the static classes like bd_util, bd_db, bd_config, and bd_session as well as Program and Startup a constructed and stay alive as singletons during the entire program. Any of them with global static variables, those variables serve as a cache.
The one thing to keep in mind is that the global static variables can be accessed by multiple threads, so need to be protected.
Look especially at bd_session, which I'm not using for anything, but I created it because I thought I was using it.
So, in other words, HOW to cache is not an issue.
What is an issue is that the logic for maintaining the cache is just one more thing that can be buggy, one more thing to break, so I don't want to do it if the benefit is small.
That's why I mentioned EF as it encapsulates all the work with cache.
Right, if ALL our database updates were done via EF, then EF caching would make sense, but it's either all or nothing. For EF to cache correctly we would have to do all updates via EF.
I debating whether to use EF or not during this rewrite but I just decided I wasn't interested. Maybe it would have been better, but I'm still happy with my choice.
For your english practice:
http://blogs.tedneward.com/post/the-vietnam-of-computer-science/
So many letters. 😄
I agree with many things. But something has changed since then.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/
Yeah, maybe the codebase would be better if I did the db stuff a different way.
what is the purpose of Where(x => true) in your example?
And that tool you are using where you can type C# code instead of sql into it, is there something like that available for linux?
"Bugs" is an EF model?
Yeah, maybe the codebase would be better if I did the db stuff a different way.
what is the purpose of Where(x => true) in your example?
The predicate is always true, get all records.
And that tool you are using where you can type C# code instead of sql into it, is there something like that available for linux?
"Bugs" is an EF model?
Like https://docs.microsoft.com/en-us/dotnet/api/system.linq.iqueryable-1?view=net-5.0
Concerning concepts:
Identity
https://docs.microsoft.com/en-us/dotnet/api/system.guid?view=net-5.0
https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods?view=vs-2019
State
https://en.wikipedia.org/wiki/Data_transfer_object
Behavior
https://en.wikipedia.org/wiki/Service_statelessness_principle
Inheritance
https://en.wikipedia.org/wiki/Inversion_of_control
https://forum.linqpad.net/discussion/1983/roadmap-for-cross-platform-ubuntu-linux
I think EF with console logging will show SQL.
Concerning concepts:
Identity
https://docs.microsoft.com/en-us/dotnet/api/system.guid?view=net-5.0
https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods?view=vs-2019State
https://en.wikipedia.org/wiki/Data_transfer_objectBehavior
https://en.wikipedia.org/wiki/Service_statelessness_principleInheritance
https://en.wikipedia.org/wiki/Inversion_of_control
I don't understand why you are sending this to me. I don't understand how it relates to what we've talked about. Please explain.
I'm timing how long it takes Issue.cshtml.cs OnGet, and it's usually about 20 milliseconds, so there's no point in trying to optimize it more, it's already so fast.
I don't understand why you are sending this to me. I don't understand how it relates to what we've talked about. Please explain.
These issues are addressed in the article. I thought this might be interesting.
Object systems are typically characterized by four basic components: identity, state, behavior and encapsulation. Identity is an implicit concept in most O-O languages, in that a given object has a unique identity that is distinct from its state (the value of its internal fields)–two objects with the same state are still separate and distinct objects, despite being bit-for-bit mirrors of one another. This is the “identity vs. equivalence” discussion that occurs in languages like C++, C# or Java, where developers must distinguish between “a == b” and “a.equals(b)”.
From article.
I'm timing how long it takes Issue.cshtml.cs OnGet, and it's usually about 20 milliseconds, so there's no point in trying to optimize it more, it's already so fast.
👍
Sorry, I don't understand how the quote about identity relates to decisions about how to code Budoco.
This applies to EF or ORM.
Although the article shows the problem, but, as far as I know, this is solved.
"this is solved". WHAT is solved? I still don't understand how this discussion relates to decisions about how to code Budoco.
In the second case, "Name" became a unique key as in the database.
You read the article more carefully than me!
I dislike having to learn an API (EF) to write a language that I already know how to write (SQL).
The abstraction is super leaky, like N+1, or any query that returns something that isn't a "User", but rather just a column from the users table, or a join between two tables.
If I just want everything LINQ'ified, then maybe Dapper would be good, but 99% of what i do is just foreach (DataRow dr.... so why would I bring in another library just so that it loads the DataTable results into a different kind of collection?
There are some things I like about ORMs:
-
a Migration system for free. But it's not too hard to write one. A dozen lines of code. But, I still have to write and test it.
-
Putting together a complex SQL statement at runtime. Rails ActiveRecord is really good for this. Doing it with string the way I did it in BugTracker.NET, that's messy. But Budoco does way way way less with dynamic sql, and the most complicated sql is outside the C# code - the sql that's in the external queries and reports. The whole culture of Budoco/BugTracker.NET is YOU HAVE TO LIKE WRITING SQL.
The abstraction is super leaky, like N+1, or any query that returns something that isn't a "User", but rather just a column from the users table, or a join between two tables.
Don't use object graph.
All libraries over SQL solve other problems in parallel: caching, code duplication, security ...
Of course, all this is not unambiguous.
The solve all problems except for the 1,400 open issues against EF.